hinzufügen AS die javax.json docs den Weg legen eine JsonObject wird mit den mitgelieferten Builder wie zu erstellen:JSR-353 Wie Nullwerte mit javax.json.JsonObjectBuilder
JsonBuilderFactory factory = Json.createBuilderFactory(config);
JsonObject value = factory.createObjectBuilder()
.add("firstName", "John")
.add("lastName", "Smith")
.add("age", 25)
.add("address", factory.createObjectBuilder()
.add("streetAddress", "21 2nd Street")
.add("city", "New York")
.add("state", "NY")
.add("postalCode", "10021"))
.add("phoneNumber", factory.createArrayBuilder()
.add(factory.createObjectBuilder()
.add("type", "home")
.add("number", "212 555-1234"))
.add(factory.createObjectBuilder()
.add("type", "fax")
.add("number", "646 555-4567")))
.build();
In diesem Beispiel werden Werte für die gibt Schlüssel.
JsonBuilderFactory factory = Json.createBuilderFactory(config);
JsonObject value = factory.createObjectBuilder()
.add("firstname", customer.getFirstame())
.add("lastname", customer.getLastame())
.add("age", customer.getAge())
....
Die JsonOBjectBuilder eine NPE falls Schlüssel werfen oder Wert ist null: Im wirklichen Leben sind die Werte wahrscheinlich von einigen (pojo) Domain-Objekt wie abgeleitet. Falls der Kunde kein registriertes Alter hat, wird der obige Code eine NPE werfen.
Also grundsätzlich für jedes Feld, das ich hinzufügen, muss ich überprüfen, ob der Wert null ist oder nicht, und fügen Sie den tatsächlichen Wert und ansonsten nicht das Feld hinzufügen oder hinzufügen JsonValue.NULL für den Schlüssel. Diese viel (unerwünschtes) vorformulierten verursacht ...
In meinem Fall kam ich wie mit benutzerdefinierten JsonUtils Klasse einschließlich verschiedene statische Methoden auf:
public static void add(JsonObjectBuilder builder, String name, Long value) {
if (value == null) {
builder.add(name, JsonValue.NULL);
}
else {
builder.add(name, value);
}
}
public static void add(JsonObjectBuilder builder, String name, String value) {
if (value == null) {
builder.add(name, JsonValue.NULL);
}
else {
builder.add(name, value);
}
}
und dann ruft:
builder = Json.createObjectBuilder();
JsonUtils.add(builder, "id", customer.getId());
JsonUtils.add(builder, "name", customer.getName());
JsonUtils.add(builder, "gender", customer.getGender());
builder.build()
Aber irgendwie, wenn sich nicht richtig anfühlt. Warum bietet die javax.json keine einfache Möglichkeit, Nullwerte hinzuzufügen (ohne wenn sonst Boilerplate) oder fehlt mir etwas?
Mein Hauptpunkt critism gegen den JSR-353 api ist, dass obwohl es wie ein wirklich schön fließend api (siehe oben Beispiel von apidoc) aussieht, aber in Wirklichkeit ist es nicht.
Es gibt buchstäblich Dutzende von besseren Möglichkeiten als JSR-353; also vielleicht einen Blick auf sagen, Jackson jr (https://github.com/FasterXML/jackson-jr)? Es hat wirklich fließende API ("Komponisten"), im Gegensatz zu JSON-P, das mehr "sorta-fast-fast" Version hat. – StaxMan