【问题标题】:How to use replace(K,V) in javax.json.JsonObject?如何在 javax.json.JsonObject 中使用 replace(K,V)?
【发布时间】:2020-02-24 13:54:35
【问题描述】:

我需要读取一个 JsonObject,修改一个值,然后继续。比方说:

{ "aKey": "old value", , "anotherKey": "another value" }

应该改为:

{ "aKey": "new value", "anotherKey": "another value" }

我读到 JsonObject 是不可变的,它在文档和这里: How to Modify a javax.json.JsonObject Object?

反正JsonObject也提供了一个名为replace(K key, V value)的方法,描述如下: 仅当当前映射到某个值时才替换指定键的条目。

如何使用这个方法?有什么例子吗?

我尝试了不同的方式,例如,如果我这样做:

jsonObject.replace("aKey", Json.createObjectBuilder().add("aKey", "new value").build());

我收到java.lang.UnsupportedOperationException

我想我应该在复制期间进行替换 (??)。也就是把旧对象除了我要替换的值之外的所有值都加起来?

【问题讨论】:

    标签: javax.json


    【解决方案1】:

    最后我创建了自己的函数。它返回带有替换键/值的对象(在我的例子中是字符串/字符串):

    JsonObject myReplace(JsonObject jsonObject, String key, String newValue) {
        JsonObjectBuilder createObjectBuilder = Json.createObjectBuilder();
        Iterator it = jsonObject.entrySet().iterator();
        while (it.hasNext()) {
            JsonObject.Entry mapEntry = (JsonObject.Entry)it.next();
            if(mapEntry.getKey() == key){
                createObjectBuilder.add(key, newValue);
            }
            else{
                createObjectBuilder.add(mapEntry.getKey().toString(), mapEntry.getValue().toString());
            }
        }
        return createObjectBuilder.build();
    }
    

    所以我可以这样做:

    myJsonObject = myReplace(myJsonObject, "aKey", "newValue"); // I know,  the assignement could be done in the method, too.
    

    【讨论】:

    • 这个函数可以解决问题。无论谁正在阅读本文,请注意,如果 JsonObject 本身是另一个对象或数组的子对象,那么修改它对其父对象没有任何影响!由于父对象(或数组)也是不可变的。他们的父母也是不可变的。必须将整个对象和数组树交换为修改过的对象。
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2011-03-06
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多