折叠数据结构

问题描述 投票:0回答:1

我想删除内部关键字 attributeselements 这样属性和元素就是 json 对象本身的一部分。有没有办法在 Rascal 中为 json 文件执行此操作。

{
    "attributes": {
        "name": "\"physics\""
    },
    "elements": {
        "material": [
            {
                "attributes": {
                    "name": "\"blue\""
                },
                "elements": {
                    "color": [
                        {
                            "attributes": {
                                "rgba": [
                                    -1.2,
                                    0,
                                    0.8,
                                    1
                                ]
                            }
                        }
                    ]
                }
            },
            {
                "attributes": {
                    "name": "\"black\""
                },
                "elements": {
                    "color": [
                        {
                            "attributes": {
                                "rgba": [
                                    0,
                                    0,
                                    0,
                                    1
                                ]
                            }
                        }
                    ]
                }
            }
        ],
    }
}

我创建了一个数据结构来解析 xml 文件的键值对。在 json 文件中,我想摆脱属性和元素并使用嵌套对象而不是元素。

rascal
1个回答
0
投票

这个答案是一个非常具体的转换,只与您对每个对象都有“属性”和“元素”字段的 JSON 对象的特定选择有关。有点令人费解的是,为什么我们首先要对对象进行这种“双重编码”,但是您仍然可以使用 Rascal 将其删除。

这是一个自下而上的转换,匹配每个节点的结构,并使用标准库中

Node
模块中的函数将其转换为另一个。我们需要它能够创建任意参数的节点,目前还没有语法。

import Map;
import Node;

// the heavy work is the pattern match that uses the contract of the 
// encoding: two attributes named "attributes" and "elements", each pointing to another object that encodes a map. 
value transform("object"(attributes=node attrs, elements=node elems)) 
  = makeNode([transform(x) | value x <- getKeywordParameters(elems)<1>],
          keywordParameters=(k:transform(b) | <k,v> <- toRel(getKeywordParameters(attrs));
   
// lists need some recursion
value transform(list[value] l) = [transform(e) | e <- l];

// all other stuff is copied one-to-one
default value transform(value v) = v;

我还没有对此进行测试,但你有一个大概的想法。每个案例的递归+基于模式的调度。

© www.soinside.com 2019 - 2024. All rights reserved.