How to edit, modify nested JSONObject

前端 未结 4 1663
野趣味
野趣味 2021-02-14 21:29

Could you help me with this issue please. for example I have JSONEObject

{
\"glossary\": {
    \"title\": \"example glossary\",
    \"GlossDiv\": {
        \"ti         


        
相关标签:
4条回答
  • 2021-02-14 21:53

    Update/ edit/modify nested JSON Object and converting String to JSON by using org.json.simple.JSONObject recursive call

    JSON Input file

    {
      "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
      }
    }
    
    

    Code for the converting String to JSON Object and Updating the Nested JSON object value against the specific Key Example: "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 Output:

    {
      "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
      }
    }
    
    0 讨论(0)
  • 2021-02-14 22:01

    I found solution.

        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));
    
    0 讨论(0)
  • 2021-02-14 22:13

    You don't need to remove before calling put. JSONObject#put will replace any existing value. Simply call

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

    But how to get to wanted key for one step?

    You don't. You have a nested object tree. You must go through the full tree to reach your element. There might be a library out there that does this for you, but underneath it all, it will be traversing everything.

    0 讨论(0)
  • 2021-02-14 22:20

    Here i have written a simple function with recursion:

    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;
    }
    
    0 讨论(0)
提交回复
热议问题