如何编辑,修改嵌套的JSONObject

时间:2014-09-17 15:25:19

标签: java json

请帮我解决这个问题。 例如,我有JSONEObject

{
"glossary": {
    "title": "example glossary",
    "GlossDiv": {
        "title": "S",
        "seeds": "12415",
    }
}

}

例如,我需要改变种子":#34; 12415"到种子":" 555"。 我找到了一些解决方案:

JSONObject js = new JSONObject(jsonString);
js.getJSONObject("glossary").getJSONObject("GlossDiv").remove("seeds");
js.getJSONObject("glossary").getJSONObject("GlossDiv").put("seeds","555");

因此,为了在我的版本中编辑种子,我首先需要获得"词汇表"那么" GlossDiv"在我删除"种子"并把新的种子"具有新价值。

你能帮我找另一种编辑方式吗?例如:只是somemethod(String key,String NewValue)。

4 个答案:

答案 0 :(得分:2)

在致电remove之前,您无需putJSONObject#put将取代任何现有价值。只需致电

js.getJSONObject("glossary").getJSONObject("GlossDiv").put("seeds", "555");
  

但是如何一步到位想要钥匙?

你没有。您有一个嵌套的对象树。您必须通过完整的树来到达您的元素。可能有一个图书馆可以为你做这件事,但在这一切之下,它将遍历一切。

答案 1 :(得分:1)

  

更新/编辑/修改嵌套的JSON对象,并通过递归使用org.json.simple.JSONObject将String转换为JSON

JSON输入文件

{
  "Response": {
    "AccountId": "12345",
    "CompanyCode": 1,
    "CustomerName": "Joseph X. Schmoe",
    "EmailAddressList": {
      "Response.EmailAddressDTO": {
        "AlertOptionList": null,
        "ContactMethodSeqNum": 2,
        "EmailAddress": null
      }
    },
    "MailingAddress": {
      "NonStandard": null,
      "Standard": {
        "Address": "Example",
        "DisplayAddressText": null
      }
    },
    "LastBill": null,
    "LastPayment": null
  }
}

用于将String转换为JSON对象并根据特定的Key更新嵌套的JSON对象值的代码示例:“ Address”:“ Addressxxxxxx”,

public static void main(String[] args) throws IOException {

        FileInputStream inFile = new FileInputStream("File_Location");
        byte[] str = new byte[inFile.available()];
        inFile.read(str);
        String string = new String(str);
        JSONObject json = JSONEdit.createJSONObject(string);
        System.out.println(JSONEdit.replacekeyInJSONObject(json,"Address","Addressxxxxxx"));
    }

    private static JSONObject replacekeyInJSONObject(JSONObject jsonObject, String jsonKey,
            String jsonValue) {

        for (Object key : jsonObject.keySet()) {
            if (key.equals(jsonKey) && ((jsonObject.get(key) instanceof String)||(jsonObject.get(key) instanceof Number)||jsonObject.get(key) ==null)) {
                jsonObject.put(key, jsonValue);
                return jsonObject;
            } else if (jsonObject.get(key) instanceof JSONObject) {
                JSONObject modifiedJsonobject = (JSONObject) jsonObject.get(key);
                if (modifiedJsonobject != null) {
                    replacekeyInJSONObject(modifiedJsonobject, jsonKey, jsonValue);
                }
            }

        }
        return jsonObject;
    }

    private static JSONObject createJSONObject(String jsonString){
        JSONObject  jsonObject=new JSONObject();
        JSONParser jsonParser=new  JSONParser();
        if ((jsonString != null) && !(jsonString.isEmpty())) {
            try {
                jsonObject=(JSONObject) jsonParser.parse(jsonString);
            } catch (org.json.simple.parser.ParseException e) {
                e.printStackTrace();
            }
        }
        return jsonObject;
    }

JSON输出:

{
  "Response": {
    "AccountId": "12345",
    "CompanyCode": 1,
    "CustomerName": "Joseph X. Schmoe",
    "EmailAddressList": {
      "Response.EmailAddressDTO": {
        "AlertOptionList": null,
        "ContactMethodSeqNum": 2,
        "EmailAddress": null
      }
    },
    "MailingAddress": {
      "NonStandard": null,
      "Standard": {
        "Address": "Addressxxxxxx",
        "DisplayAddressText": null
      }
    },
    "LastBill": null,
    "LastPayment": null
  }
}

答案 2 :(得分:0)

我找到了解决方案。

    public static JSONObject setProperty(JSONObject js1, String keys, String valueNew) throws JSONException {
    String[] keyMain = keys.split("\\.");
    for (String keym : keyMain) {
        Iterator iterator = js1.keys();
        String key = null;
        while (iterator.hasNext()) {
            key = (String) iterator.next();
            if ((js1.optJSONArray(key) == null) && (js1.optJSONObject(key) == null)) {
                if ((key.equals(keym))) {
                    js1.put(key, valueNew);
                    return js1;
                }
            }
            if (js1.optJSONObject(key) != null) {
                if ((key.equals(keym))) {
                    js1 = js1.getJSONObject(key);
                    break;
                }
            }
            if (js1.optJSONArray(key) != null) {
                JSONArray jArray = js1.getJSONArray(key);
                for (int i = 0; i < jArray.length(); i++) {
                    js1 = jArray.getJSONObject(i);
                }
                break;
            }
        }
    }
    return js1;
}

public static void main(String[] args) throws IOException, JSONException {
    FileInputStream inFile = new FileInputStream("/home/ermek/Internship/labs/java/task/test5.json");
    byte[] str = new byte[inFile.available()];
    inFile.read(str);
    String text = new String(str);
    JSONObject json = new JSONObject(text);
    setProperty(json, "rpc_server_type", "555");
    System.out.println(json.toString(4));

答案 3 :(得分:0)

这里我写了一个简单的递归函数:

public static JSONObject replaceAll(JSONObject json, String key, String newValue) throws JSONException {
    Iterator<?> keys = json.keys();
    while (keys.hasNext()) {
        String k = (String) keys.next();
        if (key.equals(k)) {
            json.put(key, newValue);
        }
        Object value = json.opt(k);
        if (value != null && value instanceof JSONObject) {
            replaceAll((JSONObject) value, key, newValue);
        }
    }
    return json;
}