【发布时间】:2018-03-16 02:24:58
【问题描述】:
我有一个非常复杂的json 结构。它包含许多 array elements 并且这些数组元素包含其他数组元素等等。
请参阅下面的json 树结构。
Json 树结构一:
Json 树结构-2:
正如上面用黄色突出显示的,我想更新“rdKey”字段的值。
我写了下面的代码,它工作得很好:
String json = "escaped string (as it's a big string, I can't put it here)";
JSONObject jsonObj = new JSONObject(json);
if (jsonObj.has("responseMap")) {
JSONObject responseMap = jsonObj.getJSONObject("responseMap");
if (responseMap.has("ValueJson")) {
JSONObject valueJson = responseMap.getJSONObject("ValueJson");
if (valueJson.has("ticketBean_CM")) {
JSONObject ticketBean_CM = valueJson.getJSONObject("ticketBean_CM");
if (ticketBean_CM.has("addByGamma")) {
String addByGamma = ticketBean_CM.getString("addByGamma");
System.out.println(addByGamma);
if (addByGamma.equals("VCE")) {
if (responseMap.has("ScreenJson")) {
JSONObject screenJson = responseMap.getJSONObject("ScreenJson");
if (screenJson.has("sections")) {
JSONArray sectionArray1 = screenJson.getJSONArray("sections");
if (sectionArray1.length() > 0) {
JSONObject section0 = sectionArray1.getJSONObject(0);
if (section0.has("sections")) {
JSONArray sectionArray2 = section0.getJSONArray("sections");
if (sectionArray2.length() > 3) {
JSONObject section6 = sectionArray2.getJSONObject(3);
if (section6.has("sections")) {
JSONArray sectionArray3 = section6.getJSONArray("sections");
if (sectionArray3.length() > 1) {
JSONObject section8 = sectionArray3.getJSONObject(1);
if (section8.has("elements")) {
JSONArray elementsArray1 = section8
.getJSONArray("elements");
if (elementsArray1.length() > 0) {
JSONObject elements1 = elementsArray1.getJSONObject(0);
if (elements1.has("elements")) {
JSONArray elementsArray2 = elements1
.getJSONArray("elements");
if (elementsArray2.length() > 4) {
JSONObject elements2 = elementsArray2
.getJSONObject(4);
if (elements2.has("rdKey")) {
System.out.println(
elements2.getString("rdKey"));
elements2.put("rdKey",
"CircuitID(FullPartial)");
System.out.println(
elements2.getString("rdKey"));
System.out.println(jsonObj.toString());
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
如果有更好的解决方案,我希望你们帮助我。我可以在不遍历整个 json 对象的情况下做到这一点(直到找到相关字段)吗?如果json 树结构发生更改,此解决方案将不起作用,它需要是静态的,作为此代码的成功场景。
请提出更好的解决方案。
【问题讨论】:
-
你可以使用
for loopfor ["responseMap", "ValueJson", "ticketBean_CM" , ..., 4 ] 因为你的编码风格几乎相同 -
我没有通过它,请你帮忙。
-
您的结构中似乎有很多条件(如数组中的位置和一些列名)。这是一个特定的约束,就像你之后不需要那样的东西还是你需要经常通过这些数组?对于后者,我建议创建代表您的对象的 Java bean 以便于访问。否则,您可以创建自己的微型 API,以免重复“如果长度元素部分等”。
-
@Asoub :我需要经常检查这些数组,即在每次调用我的 API 时,我都需要更改“rdKey”的值。请您启发创建一个小型 API不再重复。
-
对不起,我不清楚,我的意思是“经常”在代码方面:您是否有很多代码通过数组来获取/更新特定数据,例如您在上面发布的或者是它是你代码中唯一的地方吗?我会在anwser中详细说明