我想删除内部关键字 attributes 和 elements 这样属性和元素就是 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 文件中,我想摆脱属性和元素并使用嵌套对象而不是元素。
这个答案是一个非常具体的转换,只与您对每个对象都有“属性”和“元素”字段的 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;
我还没有对此进行测试,但你有一个大概的想法。每个案例的递归+基于模式的调度。