Javascript 合并两个JSONata表达式
我使用JSONata执行JSON到JSON的转换 出于一些独特的原因,我想合并两个JSONata表达式: 例如: 父表达式:Javascript 合并两个JSONata表达式,javascript,json,transformation,jsonata,Javascript,Json,Transformation,Jsonata,我使用JSONata执行JSON到JSON的转换 出于一些独特的原因,我想合并两个JSONata表达式: 例如: 父表达式: var script = ` { "data": { "name" : data.payload.Name.(FirstName & ' ' & LastName), "alias": data.payload.Name.(Salutation & ' ' & Firs
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 & "!"
}
}
`;
{
"source" : source
}
{
"data": {
"email" : data.payload.Email
}
}
我还有一些简单的赋值类型的JSONata表达式,如:
表达式1:
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 & "!"
}
}
`;
{
"source" : source
}
{
"data": {
"email" : data.payload.Email
}
}
表达式2:
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 & "!"
}
}
`;
{
"source" : source
}
{
"data": {
"email" : data.payload.Email
}
}
我想将以上两个表达式添加到使用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
}
}
`;
如何使用javascript/JSONata
背景和约束条件:
“a”:x.y.z或“b”:x
data.Email
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 & "!"
}
}
`;
{
"source" : source
}
{
"data": {
"email" : data.payload.Email
}
}
- 我尝试将JSONata脚本转换为JSON,方法是将值放在双引号下,并使用escape()函数对值进行编码李>
- 一旦我有了JSON,我就会寻找子表达式中提到的路径(比如data.Email)
- 如果路径存在:替换其值
- 如果路径不存在:创建路径并赋值
- 如果路径应该被删除:只需删除它
- 一旦我处理完上面的JSON, 通过使用一堆正则表达式删除引号,然后应用unescape()方法进行解码,我将其转换为JSONata脚本
- 这种方法的问题是:
- 不可靠(正则表达式匹配和替换不是完全可靠的)
- 我不确定是否每个JSONata(不声明任何函数)都可以始终转换为有效的JSON
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()
问题是如何处理你的新AST。在我的例子中,我还编写了一个自定义序列化程序,将AST转换回JSONata字符串,并对其进行计算
使用中的AST 表达式1的AST
{
"type": "unary",
"value": "{",
"position": 1,
"lhs": [
[
{
"value": "source",
"type": "string",
"position": 13
},
{
"type": "path",
"steps": [
{
"value": "source",
"type": "name",
"position": 22
}
]
}
]
]
}
表达式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
}
]
}
]
]
}
]
]
}
组合AST
{
"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
}
]
}
]
]
}
]
]
}
这看起来很有希望。您可以共享自定义序列化程序的代码吗。如果可能,我们可以通过电子邮件进行连接。