如何在不将其更改为对象的情况下提取 mule 流中的嵌套 json 元素?

How to extract nested json elements in mule flow without changing it to Object?

我有一个要求,其中我需要从 JSON 输入中提取键的值到 mule 流中,以检查选择流控制中的条件。我的 JSON 是这样的,我想提取 "todelete"。我不想将我的 JSON 更改为对象。请提出建议。

    [
        {
            "selectiontypeid" : 133,
            "internalrecipientstatusid" : 123,
            "createdby" : "Anu",
            "createddate" : "06/26/2017",
            "authorizedby" : "Anu",
            "authorizeddate" : "06/26/2017",
            "individualdata" :

             [
                        { "intexchangegroupname" : "abc", "employeename" : "abc", "todelete" : "Y"},
                        { "intexchangegroupname" : "abc", "employeename" : "abc", "todelete" : "N"},
                        { "intexchangegroupname" : "abc", "employeename" : "abc", "todelete" : "N"}
             ]

        }
    ]

todelete 单独对我来说没有任何意义。你可能想要 individualdata 数组,对吧?

只需使用以下 MEL #[payload.individualdata]

或以下数据编织:

%dw 1.0
%output application/json
---
payload.individualdata

这将导致以下 json:

[
  [
    {
      "intexchangegroupname": "abc",
      "employeename": "abc",
      "todelete": "Y"
    },
    {
      "intexchangegroupname": "abc",
      "employeename": "abc",
      "todelete": "N"
    },
    {
      "intexchangegroupname": "abc",
      "employeename": "abc",
      "todelete": "N"
    }
  ]
]

如果您想摆脱外部数组,请在数据编织中的 payload.individualdata 上应用 flatten

我创建了方法并将 json 文件保存在资产文件夹中试试这个。

     public static String loadJSONFromAsset(Context context,String 
  filename) {
    String json = null;
    try {
        InputStream is = context.getAssets().open(filename);
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;
}

然后

 public void loadJson(){

    try {
        JSONArray mainResposeArray =  new JSONArray(Utilities.loadJSONFromAsset(Activity.this,"demo.json"));

        JSONObject mJsonObject  = mainResposeArray.getJSONObject(0);

        JSONArray itemArray = mJsonObject.getJSONArray("individualdata");


        if(itemArray.length() > 0){

            for(int pos = 0; pos<itemArray.length();pos++){
                JSONObject mSubDataObject = itemArray.getJSONObject(pos);

                String intexchangegroupname = mSubDataObject.getString("intexchangegroupname");
                String todelete = mSubDataObject.getString("todelete");

                Log.d("value",intexchangegroupname);
            }


        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

}

与 xpath3() 相同,MEL 具有 JsonPath 以访问 json 字符串中的值。 语法:

[json:yourpath/node]

上面的内容现在可以工作了我不得不将输出更改为 application/java 并且它工作了。感谢大家的帮助。

希望下面的代码能满足您的要求

payload.individualdata[0].*删除