首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改javax.json.JsonObject对象?

如何修改javax.json.JsonObject对象?
EN

Stack Overflow用户
提问于 2015-11-20 00:39:43
回答 4查看 7.2K关注 0票数 11

我正在编写一个特性,在其中我读并写回了json。但是,我可以从文件中读取json元素,但不能编辑相同加载的对象。这是我正在做的代码。

代码语言:javascript
复制
InputStream inp = new FileInputStream(jsonFilePath);
JsonReader reader = Json.createReader(inp);

JsonArray employeesArr = reader.readArray();
for (int i = 0; i < 2; i++) {
    JsonObject jObj = employeesArr.getJsonObject(i);
    JsonObject teammanager = jObj.getJsonObject("manager");

    Employee manager = new Employee();
    manager.name = teammanager.getString("name");
    manager.emailAddress = teammanager.getString("email");
    System.out.println("uploading File " + listOfFiles[i].getName());
    File file  = insertFile(...);
    JsonObject tmpJsonValue = Json.createObjectBuilder()
        .add("fileId", file.getId())
        .add("alternativeLink", file.getAlternateLink())
        .build();

    jObj.put("alternativeLink", tmpJsonValue.get("alternativeLink"));  <-- fails here 
}

运行它时,我会得到以下异常。

线程"main“java.lang.UnsupportedOperationException中的异常 在java.util.AbstractMap.put(AbstractMap.java:203) 在com.mongodb.okr.DriveQuickstart.uploadAllFiles(DriveQuickstart.java:196) 在com.mongodb.okr.App.main(App.java:28)

EN

回答 4

Stack Overflow用户

发布于 2015-11-20 00:45:56

JsonObject

JsonObject类表示一个不变的 JSON对象值(零个或多个名称/值对的无序集合)。它还为JSON对象名称/值映射提供了不可修改的映射视图。

你不能修改这些对象。

你需要创建一个副本。似乎没有一种直接的方法可以做到这一点。看起来您需要使用Json.createObjectBuilder()并自己构建它(参见javadoc链接中的示例)。

票数 15
EN

Stack Overflow用户

发布于 2020-06-03 07:53:36

Sotirios回答说,您可以使用JsonObjectBuilders。要将值插入到JsonObject中,可以使用方法:

代码语言:javascript
复制
private JsonObject insertValue(JsonObject source, String key, String value) {
    JsonObjectBuilder builder = Json.createObjectBuilder();
    builder.add(key, value);
    source.entrySet().
            forEach(e -> builder.add(e.getKey(), e.getValue()));
    return builder.build();
}

要将JsonObject插入到JsonObject中,可以使用以下方法:

代码语言:javascript
复制
private JsonObject insertObject(JsonObject parent, JsonObject child, String childName) {
    JsonObjectBuilder child_builder = Json.createObjectBuilder();
    JsonObjectBuilder parent_builder = Json.createObjectBuilder();
    parent.entrySet().
            forEach(e -> parent_builder.add(e.getKey(), e.getValue()));
    child.entrySet().
            forEach(e -> child_builder.add(e.getKey(), e.getValue()));
    parent_builder.add(childName, child_builder);
    return parent_builder.build();
}

请注意,如果您在将子JsonObject插入另一个“父”JsonObject后更改它,它将不会对“父”JsonObject产生任何影响。

票数 3
EN

Stack Overflow用户

发布于 2021-09-29 13:38:38

JsonObject是不可变的,因此您不能修改对象,可以使用此示例并尝试从中激发灵感:创建包含相同值的新JsonObject并向其添加一些元素。

示例:

代码语言:javascript
复制
        import java.io.ByteArrayInputStream;
        import java.io.InputStream;

        import javax.json.Json;
        import javax.json.JsonArray;
        import javax.json.JsonArrayBuilder;
        import javax.json.JsonObject;
        import javax.json.JsonObjectBuilder;
        import javax.json.JsonReader;
        import javax.json.JsonValue;


        public class Jsonizer {
        public static void main(String[] args) {

    try {
        String s = "{\"persons\": [ {\"name\":\"oussama\",\"age\":\"30\"}, {\"name\":\"amine\",\"age\":\"25\"} ]}";
        InputStream is = new ByteArrayInputStream(s.getBytes());
        JsonReader jr = Json.createReader(is);
        JsonObject jo = jr.readObject();
        System.out.println("Before :");
        System.out.println(jo);
        JsonArray ja = jo.getJsonArray("persons");

        InputStream targetStream = new ByteArrayInputStream("{\"name\":\"sami\",\"age\":\"50\"}".getBytes());
        jr = Json.createReader(targetStream);
        JsonObject newJo = jr.readObject();
        JsonArrayBuilder jsonArraybuilder = Json.createArrayBuilder();
        jsonArraybuilder.add(newJo);
        
        for (JsonValue jValue : ja) {
            jsonArraybuilder.add(jValue);
        }
        
        ja = jsonArraybuilder.build();
        JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder();
        jsonObjectBuilder.add("persons", ja);
        JsonObject jsonAfterAdd = jsonObjectBuilder.build();
        System.out.println("After");
        System.out.println(jsonAfterAdd.toString());

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

  }
 }

输出:

代码语言:javascript
复制
       Before :
       {"persons":[{"name":"oussama","age":"30"},{"name":"amine","age":"25"}]}
       After
       {"persons":[{"name":"sami","age":"50"},{"name":"oussama","age":"30"},{"name":"amine","age":"25"}]}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33817045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档