Vraag javax.json: voeg nieuw JsonNumber toe aan bestaande JsonObject


Ik wil eigenschappen toevoegen aan een bestaand exemplaar van JsonObject. Als deze eigenschap is boolean, dit is vrij eenvoudig:

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

Ik wil echter ook een toevoegen JsonNumber maar ik kon geen manier vinden om een ​​instantie van te maken JsonNumber. Dit is wat ik zou kunnen doen:

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

Maar ik kon geen vuile manier bedenken om mijn taak te volbrengen. Dus - is er meer directe, schonere benadering om een ​​toe te voegen JsonNumber naar een bestaand exemplaar van JsonObject?


11
2017-10-13 17:59


oorsprong


antwoorden:


Oké, ik heb het zelf uitgevonden: Dat kan niet.

JsonObject hoort onveranderlijk te zijn. Zelfs als JsonObject.put(key, value) bestaat, tijdens runtime zal dit een UnsupportedOperationException. Dus als u een sleutel / waarde-paar aan een bestaande wilt toevoegen JsonObject je hebt zoiets nodig

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

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

    return job;
}

en gebruik het dan met

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

22
2017-10-13 18:17



JsonObject is onveranderbaar maar kan worden gekopieerd naar een JsonObjecBuilder met behulp van lambda's.

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

0
2018-04-30 23:52