Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 合并两个JSONata表达式_Javascript_Json_Transformation_Jsonata - Fatal编程技术网

Javascript 合并两个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

我使用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 & "!"
       }       
  }
`;
{
   "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

背景和约束条件:

  • 子表达式(示例中的表达式1和2)(应该添加到父表达式中)将始终是简单的赋值,如
    “a”:x.y.z或“b”:x

  • 子表达式可能已存在于父表达式中。在这种情况下,它将取代赋值

  • 我还想从父表达式中删除一些json路径(当然,如果存在的话),比如删除路径
    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

    我认为最好的办法是将表达式翻译成JSONata,然后将它们合并成新的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() 
    
    问题是如何处理你的新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
                    }
                  ]
                }
              ]
            ]
          }
        ]
      ]
    }
    

    这看起来很有希望。您可以共享自定义序列化程序的代码吗。如果可能,我们可以通过电子邮件进行连接。