Javax.json: добавьте новый JsonNumber в существующий JsonObject
Я хочу добавить свойства к существующему экземпляру 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
?
Ответы
Ответ 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();
Ответ 2
JsonObject является неизменным, но его можно скопировать в 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
Ответ 3
Попробуйте использовать JsonPatch
String json ="{\"name\":\"John\"}";
JsonObject jo = Json.createReader(new StringReader(json)).readObject();
JsonPatch path = Json.createPatchBuilder()
.add("/last","Doe")
.build();
jo = path.apply(jo);
System.out.println(jo);