【问题标题】:JSON array into line using mule dataweave使用 mule dataweave 将 JSON 数组对齐
【发布时间】:2018-11-02 20:42:32
【问题描述】:

我有以下要求。

输入是

{ "packageConfiguration": [
      {
        "packageId": [
          "AIM_PACKAGE"
        ],
        "component": [
          "Handbook"
        ],
        "fieldName": [
          "Upload Handbook Document"
        ],
        "assetUrl": [
          "sflydamlocation.handbookfilename.pdf"
        ]
      }
    ]}

我需要把上面的json数组转换成这个输出格式:

 {
        "pakage": ""packageId":"AIM_PACKAGE", "component":"Handbook",  "fieldName":"Upload Handbook Document","assetUrl":"sflydamlocation.handbookfilename.pdf""
}

【问题讨论】:

    标签: json mule dataweave mule-esb


    【解决方案1】:

    您可以将所有字段视为字符串,但请注意:

    1. 必须对内部引号进行转义。否则输出不是有效的 JSON。
    2. 考虑到“包”的值也不是真正有效的 JSON,以防您想解析它。它应该是一个对象(例如“ { \"package\":... }")
    3. 此脚本要求所有数组都恰好有 1 个元素。更多的元素被忽略,更少的元素可能会出错。这不是一个非常健壮的设计。

    脚本(不推荐):

    %dw 2.0
    output application/json
    
    ---
    package: using (pc = payload.packageConfiguration[0]) (
    
            " \"packageId\": \"$(pc.packageId[0])\", " ++  
            " \"component\": \"$(pc.component[0])\" "  ++
            " \"fieldName\": \"$(pc.fieldName[0])\" "  ++
            " \"assetUrl\": \"$(pc.assetUrl[0])\" "
     )
    

    输出:

    {
      "package": " \"packageId\": \"AIM_PACKAGE\",  \"component\": \"Handbook\"  \"fieldName\": \"Upload Handbook Document\"  \"assetUrl\": \"sflydamlocation.handbookfilename.pdf\" "
    }
    

    这是一个丑陋的字符串连接。相反,我建议将所需的输出写为 JSON 对象。

    脚本(推荐):

    %dw 2.0
    output application/dw
    var pc = payload.packageConfiguration[0]
    ---
    package: 
        write({
            packageId: pc.packageId[0],  
            component: pc.component[0],  
            fieldName: pc.fieldName[0],  
            assetUrl: pc.assetUrl[0]
            }, "application/json") replace /\n/ with ""
    

    输出

    {
      "package": "{  \"packageId\": \"AIM_PACKAGE\",  \"component\": \"Handbook\",  \"fieldName\": \"Upload Handbook Document\",  \"assetUrl\": \"sflydamlocation.handbookfilename.pdf\"}"
    }
    

    第二个脚本更简洁,更不容易出错,并返回一个转义的 JSON 对象,您可以取消转义以用作 JSON。

    【讨论】:

    • 但在包配置中会有更多的字段..有时会添加新字段
    • 用无空格替换那些特殊字符如 \n \ { } 的任何方法
    • 这些是有助于使 JSON 打印出来的换行符,但是可以使用 replace() 函数将它们删除。我编辑了示例以删除它们。您的意思是要迭代到具有相同模式的任何字段吗?原始问题中没有提到这一点。实际上,杰尼的回答似乎就是这样做的。
    • 实际上我想删除 \ 和 { } 以便完美
    • 取消转义字符串值内的引号将不是有效的 JSON。我强烈不推荐它。如果你仍然想这样做,你可以使用 replace() 函数并返回一个 Java 字符串。
    【解决方案2】:

    这样的东西应该可以工作,除非你需要更灵活的东西。我假设您正在使用 Mule3/DW1:

    %dw 1.0
    %output application/json
    
    %var packageConfig = payload.packageConfiguration[0]
    ---
    {
      package: packageConfig mapObject ((value, key) -> {
        (key): value[0]
      })
    }
    

    【讨论】:

    • 但在包配置中可能会添加新字段,所以有什么方法可以排列它
    • 肯定会修改我的答案
    • "package": { "packageId": "AIM_PACKAGE", "component": "Handbook", "fieldName": "上传手册文档", "assetUrl": "sflydamlocation.handbookfilename.pdf" } 只需要删除那些 { 和 } 就可以了
    • 您可能可以将此答案和上述答案结合使用。祝你好运!
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2017-05-20
    • 2022-01-06
    • 2016-11-28
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多