doe*_*uvc 5 javascript json transformation jsonata
我正在使用 JSONata 来执行 JSON 到 JSON 的转换。
出于某些独特的原因,我想合并两个 JSONata 表达式:
举个例子 :
父表达式:
var script = `
{
"data":
{
"name" : data.payload.Name.(FirstName & ' ' & LastName),
"alias": data.payload.Name.(Salutation & ' ' & FirstName),
"active": data.payload.Status = 'New' ? true : false,
"signature": "Have good day ," & data.payload.Name.FirstName & "!"
}
}
`;
Run Code Online (Sandbox Code Playgroud)
我也有一些简单的赋值类型的 JSONata 表达式,例如:
表达式 1:
{
"source" : source
}
Run Code Online (Sandbox Code Playgroud)
表达式 2:
{
"data": {
"email" : data.payload.Email
}
}
Run Code Online (Sandbox Code Playgroud)
我想将以上两个表达式添加到使用script.
所以添加这两个表达式后,我应该能够得到:
var script = `
{
"source": source,
"data":
{
"name" : data.payload.Name.(FirstName & ' ' & LastName),
"alias": data.payload.Name.(Salutation & ' ' & FirstName),
"active": data.payload.Status = 'New' ? true : false,
"signature": "Have good day ," & data.payload.Name.FirstName & "!",
"email": data.payload.Email
}
}
`;
Run Code Online (Sandbox Code Playgroud)
我如何使用 javascript/JSONata ?
背景和限制:
子表达式(示例中的表达式 1 和 2)(应该添加到父表达式中)将始终是简单的赋值,如"a" : x.y.z or "b" : x.
子表达式可能已经存在于父表达式中。在这种情况下,它取代了赋值。
此外,我想从父表达式(ofcuse,如果存在)中删除一些 json 路径,例如 If delete path data.Email。
我做了什么 ?:
一旦我有了 JSON,我就会寻找子表达式中提到的路径(比如 data.Email)
完成上述 JSON 的处理后,我通过使用一堆正则表达式删除引号,然后应用 unescape() 方法进行解码,将其转换为 JSONata 脚本。
这种方法的问题是:
我认为最好的选择可能是将表达式转换为 JSONata AST,然后将它们合并到新的 AST 中。
这是一个超级简单的例子:
const ast1 = jsonata(expr1).ast();
const ast2 = jsonata(expr1).ast();
if (ast1.type !== "unary" || ast2.type!== "unary") throw Error("Only support unary expressions")
const combinedAst = {
"type": "unary",
"value": "{",
"lhs": [...ast1.lhs, ast2.lhs]
}
// TODO: Serialize the AST or inject it into jsonata()
Run Code Online (Sandbox Code Playgroud)
问题是如何处理新的 AST。就我而言,我还编写了一个自定义序列化器,将 AST 转换回 JSONata 字符串,并对其进行评估。
表达式 1 的 AST
{
"type": "unary",
"value": "{",
"position": 1,
"lhs": [
[
{
"value": "source",
"type": "string",
"position": 13
},
{
"type": "path",
"steps": [
{
"value": "source",
"type": "name",
"position": 22
}
]
}
]
]
}
Run Code Online (Sandbox Code Playgroud)
表达式 2 的 AST
{
"type": "unary",
"value": "{",
"position": 1,
"lhs": [
[
{
"value": "data",
"type": "string",
"position": 10
},
{
"type": "unary",
"value": "{",
"position": 13,
"lhs": [
[
{
"value": "email",
"type": "string",
"position": 26
},
{
"type": "path",
"steps": [
{
"value": "data",
"type": "name",
"position": 33
},
{
"value": "payload",
"type": "name",
"position": 41
},
{
"value": "Email",
"type": "name",
"position": 47
}
]
}
]
]
}
]
]
}
Run Code Online (Sandbox Code Playgroud)
联合天冬氨酸转氨酶
{
"type": "unary",
"value": "{",
"position": 1,
"lhs": [
[
{
"value": "source",
"type": "string",
"position": 12
},
{
"type": "path",
"steps": [
{
"value": "source",
"type": "name",
"position": 20
}
]
}
],
[
{
"value": "data",
"type": "string",
"position": 30
},
{
"type": "unary",
"value": "{",
"position": 33,
"lhs": [
[
{
"value": "email",
"type": "string",
"position": 46
},
{
"type": "path",
"steps": [
{
"value": "data",
"type": "name",
"position": 53
},
{
"value": "payload",
"type": "name",
"position": 61
},
{
"value": "Email",
"type": "name",
"position": 67
}
]
}
]
]
}
]
]
}
Run Code Online (Sandbox Code Playgroud)