【问题标题】:javax.json: Add new JsonNumber to existing JsonObjectjavax.json:将新的 JsonNumber 添加到现有的 JsonObject
【发布时间】:2014-10-13 17:59:31
【问题描述】:

我想向JsonObject 的现有实例添加属性。如果这个属性是boolean,这很简单:

JsonObject jo = ....;
jo.put("booleanProperty", JsonValue.TRUE);

不过,我还想添加一个JsonNumber,但我找不到创建JsonNumber 实例的方法。这是我能做的:

JsonObjectBuilder job = Json.createObjectBuilder();
JsonNumber jn = job.add("number", 42).build().getJsonNumber("number");
jo.put("numberProperty", jn);

但我想不出更肮脏的方式来完成我的任务。那么 - 是否有更直接、更简洁的方法可以将 JsonNumber 添加到 JsonObject 的现有实例?

【问题讨论】:

  • 请注意,您应该指定您使用的 JSON 工具包。你想做的事情在其中几个都是微不足道的。
  • 如标题所说,我使用的是javax.json。尽管这只是一组高级接口和工厂类,并且实现在某种程度上独立于它,但答案保持不变:使用 javax.json 时,这是不可能的。

标签: java json


【解决方案1】:

好吧,我自己想通了:你不能

JsonObject 应该是不可变的。即使JsonObject.put(key, value) 存在,在运行时也会抛出UnsupportedOperationException。因此,如果您想将键/值对添加到现有的 JsonObject,您将需要类似

private JsonObjectBuilder jsonObjectToBuilder(JsonObject jo) {
    JsonObjectBuilder job = Json.createObjectBuilder();

    for (Entry<String, JsonValue> entry : jo.entrySet()) {
        job.add(entry.getKey(), entry.getValue());
    }

    return job;
}

然后使用它

JsonObject jo = ...;
jo = jsonObjectToBuilder(jo).add("numberProperty", 42).build();

【讨论】:

  • 如果值不是 42 怎么办?我有同样的问题,我尝试: jo = jsonObjectToBuilder(jo).add(String, Object).build();它询问 JsonValue。因为我尝试创建动态方法,其值可以是字符串、整数等。我该怎么办?
  • 您在这里遇到了更一般的 Java 问题。使用重载方法时,必须在编译时解析所使用的方法。如果您使用的是Object 的实例,则无法在编译时解决,因为它最终可能是StringJsonValue。正确的解决方案可能是自己创建重载方法,这些方法接受JsonObjectBuilder.add 也支持的各种数据类型,并将它们传递到那里。重载方法说明:stackoverflow.com/questions/9598166/java-method-overloading
【解决方案2】:

尝试使用 JsonPatch

String json ="{\"name\":\"John\"}";
JsonObject jo = Json.createReader(new StringReader(json)).readObject();
JsonPatch patch = Json.createPatchBuilder()
        .add("/last","Doe")
        .build();
jo = patch.apply(jo);
System.out.println(jo);

【讨论】:

    【解决方案3】:

    JsonObject 是不可变的,但可以使用 lambdas 复制到 JsonObjecBuilder 中。

    JsonObject source = ...
    JsonObjectBuilder target = Json.createObjectBuilder();
    source.forEach(target::add); // copy source into target
    target.add("name", "value"); // add or update values
    JsonObject destination = target.build(); // build destination
    

    【讨论】:

    • 太好了,让我现在犹豫使用 JsonPatch :-)
    猜你喜欢
    • 2015-05-16
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多