更新 JSONObject 中的元素

Posted

技术标签:

【中文标题】更新 JSONObject 中的元素【英文标题】:Update elements in a JSONObject 【发布时间】:2013-02-16 01:33:39 【问题描述】:

假设我给了一个 JSONObject


 "person":"name":"Sam", "surname":"ngonma",
 "car":"make":"toyota", "model":"yaris"
 

如何更新 JSONObject 中的一些值?

如下:

String name = jsonArray.getJSONObject(0).getJSONObject("person").getString("name");
name = "Sammie";

【问题讨论】:

【参考方案1】:

使用put方法:https://developer.android.com/reference/org/json/JSONObject.html

JSONObject person =  jsonArray.getJSONObject(0).getJSONObject("person");
person.put("name", "Sammie");

【讨论】:

物有所值,也适用于person.element("name", "Sammie")【参考方案2】:

删除key再添加修改后的key,value对如下图:

    JSONObject js = new JSONObject();
    js.put("name", "rai");

    js.remove("name");
    js.put("name", "abc");

我没有用过你的例子;但在概念上是一样的。

【讨论】:

【参考方案3】:

您好,我可以向您推荐通用方法。使用递归。

    public static JSONObject function(JSONObject obj, String keyMain,String valueMain, String newValue) throws Exception 
    // We need to know keys of Jsonobject
    JSONObject json = new JSONObject()
    Iterator iterator = obj.keys();
    String key = null;
    while (iterator.hasNext()) 
        key = (String) iterator.next();
        // if object is just string we change value in key
        if ((obj.optJSONArray(key)==null) && (obj.optJSONObject(key)==null)) 
            if ((key.equals(keyMain)) && (obj.get(key).toString().equals(valueMain))) 
                // put new value
                obj.put(key, newValue);
                return obj;
            
        

        // if it's jsonobject
        if (obj.optJSONObject(key) != null) 
            function(obj.getJSONObject(key), keyMain, valueMain, newValue);
        

        // if it's jsonarray
        if (obj.optJSONArray(key) != null) 
            JSONArray jArray = obj.getJSONArray(key);
            for (int i=0;i<jArray.length();i++) 
                    function(jArray.getJSONObject(i), keyMain, valueMain, newValue);
            
        
    
    return obj;

它应该工作。如果您有任何问题,请继续。我准备好了。

【讨论】:

@EriPro 请看一下这个问题***.com/questions/35933616/… 什么是valueMain? 如果我没记错的话,应该替换的是旧值。 但是如何更新 json 数组中的特定位置?@eabyshev @Venkatesh 首先设置为参数keyMain,valueMain(key,value - json中的特定位置)和newValue用于替换【参考方案4】:

用新值更新任何 JSONObjet 的通用方法。

private static void updateJsonValues(JsonObject jsonObj) 
    for (Map.Entry<String, JsonElement> entry : jsonObj.entrySet()) 
        JsonElement element = entry.getValue();
        if (element.isJsonArray()) 
            parseJsonArray(element.getAsJsonArray());
         else if (element.isJsonObject()) 
            updateJsonValues(element.getAsJsonObject());
         else if (element.isJsonPrimitive()) 
            jsonObj.addProperty(entry.getKey(), "<provide new value>");
        

    


private static void parseJsonArray(JsonArray asJsonArray) 
    for (int index = 0; index < asJsonArray.size(); index++) 
        JsonElement element = asJsonArray.get(index);
        if (element.isJsonArray()) 
            parseJsonArray(element.getAsJsonArray());
         else if (element.isJsonObject()) 
            updateJsonValues(element.getAsJsonObject());
        

    

【讨论】:

嗨@Manohar Thummanapelly,这对我来说非常好,除了在一种情况下,我有JSONArray,只包含字符串。 “match_departments”:[“L T C”,“M I C U”]。我如何更新这些值。?当前逻辑会更新这些值。【参考方案5】:
public static JSONObject updateJson(JSONObject obj, String keyString, String newValue) throws Exception 
            JSONObject json = new JSONObject();
            // get the keys of json object
            Iterator iterator = obj.keys();
            String key = null;
            while (iterator.hasNext()) 
                key = (String) iterator.next();
                // if the key is a string, then update the value
                if ((obj.optJSONArray(key) == null) && (obj.optJSONObject(key) == null)) 
                    if ((key.equals(keyString))) 
                        // put new value
                        obj.put(key, newValue);
                        return obj;
                    
                

                // if it's jsonobject
                if (obj.optJSONObject(key) != null) 
                    updateJson(obj.getJSONObject(key), keyString, newValue);
                

                // if it's jsonarray
                if (obj.optJSONArray(key) != null) 
                    JSONArray jArray = obj.getJSONArray(key);
                    for (int i = 0; i < jArray.length(); i++) 
                        updateJson(jArray.getJSONObject(i), keyString, newValue);
                    
                
            
            return obj;
        

【讨论】:

以上是关于更新 JSONObject 中的元素的主要内容,如果未能解决你的问题,请参考以下文章

fastjson中Map与JSONObject互换

JSONObject 删除空值对

快速删除数组中的项目

fastjson的五种转换

如何将 JSON 映射到 java 模型类

JSONArray的使用