Подтвердить что ты не робот

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?

4b9b3361

Ответ 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);