Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编辑、修改嵌套的JSONObject_Java_Json - Fatal编程技术网

Java 如何编辑、修改嵌套的JSONObject

Java 如何编辑、修改嵌套的JSONObject,java,json,Java,Json,你能帮我解决这个问题吗。 例如,我有一个JSONEObject { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "seeds": "12415", } } } 例如,我需要将“种子”:“12415”更改为“种子”:“555”。 我找到了一些解决办法: JSONObject js = new JSONObject(jsonString); js

你能帮我解决这个问题吗。 例如,我有一个JSONEObject

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

例如,我需要将“种子”:“12415”更改为“种子”:“555”。 我找到了一些解决办法:

JSONObject js = new JSONObject(jsonString);
js.getJSONObject("glossary").getJSONObject("GlossDiv").remove("seeds");
js.getJSONObject("glossary").getJSONObject("GlossDiv").put("seeds","555");
因此,为了在我的版本中编辑种子,我需要先获得“glossary”,然后在删除“seeds”并将新的“seeds”添加到新值后获得“GlossDiv”


你能帮我找到另一种编辑方法吗?例如:只需somemethod(字符串键、字符串新值)。

在调用
put
之前,不需要
删除
<代码>JSONObject#put
将替换任何现有值。就叫

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

但如何才能一步到位

你没有。您有一个嵌套的对象树。您必须通过完整的树才能到达元素。可能有一个库可以为您提供这些功能,但在它的下面,它将遍历所有内容。

我找到了解决方案

    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));
publicstaticjsonobjectsetproperty(jsonobjectjs1,字符串键,字符串值new)抛出JSONException{
字符串[]keyMain=keys.split(“\\”);
for(字符串keym:keyMain){
迭代器迭代器=js1.keys();
字符串键=null;
while(iterator.hasNext()){
key=(字符串)迭代器.next();
if((js1.optJSONArray(key)==null)和&(js1.optJSONObject(key)==null)){
if((key.equals(keym))){
js1.put(键,新值);
返回js1;
}
}
if(js1.optJSONObject(key)!=null){
if((key.equals(keym))){
js1=js1.getJSONObject(key);
打破
}
}
if(js1.optJSONArray(key)!=null){
JSONArray jArray=js1.getJSONArray(key);
for(int i=0;i
使用org.JSON.simple.JSONObject递归调用更新/编辑/修改嵌套的JSON对象并将字符串转换为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
  }
}

将字符串转换为JSON对象并根据特定键更新嵌套JSON对象值的代码示例:“Address”:“Addressxxxxxx”

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

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

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;
}
publicstaticjsonobjectreplaceall(jsonobjectjson,stringkey,stringnewvalue)抛出JSONException{
迭代器keys=json.keys();
while(keys.hasNext()){
String k=(String)keys.next();
if(键等于(k)){
put(key,newValue);
}
Object value=json.opt(k);
if(value!=null&&value-instanceof-JSONObject){
replaceAll((JSONObject)值,键,newValue);
}
}
返回json;
}

您不需要删除,只需替换即可。如何替换?以及如何获取想要的密钥(例如“种子”)如果不先进入glossary对象,然后进入GlossDiv对象??好的,我给你介绍了替换!!但是如何进入想要的关键一步?请给我一些想法??很难使用代码图片,如果你的答案包含代码本身作为文本,则会更有帮助非常感谢你的回答。代码已经更新,我文本格式。这段代码可以正常工作,但当您使用toString()或toJsonString()将JSONObject转换回json字符串时,元素的顺序将被更改,并且它与原始json字符串不同。@vermap我同意你的观点,不幸的是我也遇到了这个问题,因为json包含一个键值对,所以我们需要使用Map,我们知道Map将以无序方式存储值,我们可以通过以下方法克服这一问题1.重写构造tor不使用Json的默认映射,我们可以通过重写构造函数来获取LinkedHashMap。2.简单的文件操作并更改值。3.使用一些第三方API,如Jackson@anzaransari没错,我目前正在使用选项2(替换字符串值),我知道这不是一个有效的方法,但这是我发现的唯一可行的选择。另一方面,如果你的json标签数量有限(在我的例子中,有数千个标签,一些在线工具甚至无法从给定的json创建映射器类),Jackson是一个不错的选择。我将尝试选择1。感谢分享。
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;
}