如何在不将其更改为对象的情况下提取 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].*删除
我有一个要求,其中我需要从 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].*删除