Einführung in die JSON-Binding-API (JSR 367) in Java

1. Überblick

Lange gab es keinen Standard für die JSON-Verarbeitung in Java. Die am häufigsten verwendeten Bibliotheken für die JSON-Verarbeitung sind Jackson und Gson.

Vor kurzem hat Java EE7 eine API zum Analysieren und Generieren von JSON ( https://www.jcp.org/de/jsr/detail?id=353 [JSR 353: Java-API für JSON-Verarbeitung).

Und schließlich gibt es mit der Veröffentlichung von JEE 8 eine standardisierte API ( JSR 367: Java-API für JSON-Bindung (JSON-B) ).

Derzeit sind die Hauptimplementierungen Eclipse Yasson (RI) und Apache Johnzon .

2. JSON-B-API

2.1. Maven-Abhängigkeit

Beginnen wir mit dem Hinzufügen der notwendigen Abhängigkeit.

Beachten Sie, dass es in vielen Fällen ausreichend ist, die Abhängigkeit für die gewählte Implementierung einzubeziehen.

<dependency>
    <groupId>javax.json.bind</groupId>
    <artifactId>javax.json.bind-api</artifactId>
    <version>1.0</version>
</dependency>

Die aktuellste Version finden Sie unter Maven Central .

3. Eclipse Yasson verwenden

  • Eclipse Yasson ist die offizielle Referenzimplementierung ** der JSON-Binding-API ( JSR-367 ).

3.1. Maven-Abhängigkeit

Um es zu nutzen, müssen wir die folgenden Abhängigkeiten in unser Maven-Projekt aufnehmen:

<dependency>
    <groupId>org.eclipse</groupId>
    <artifactId>yasson</artifactId>
    <version>1.0.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1.2</version>
</dependency>

Die neuesten Versionen finden Sie unter Maven Central.

4. Apache Johnzon verwenden

Eine andere Implementierung, die wir verwenden können, ist Apache Johnzon, die den APIs JSON-P (JSR-353) und JSON-B (JSR-367) entspricht.

4.1. Maven-Abhängigkeit

Um es zu nutzen, müssen wir die folgenden Abhängigkeiten in unser Maven-Projekt aufnehmen:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-json__1.1__spec</artifactId>
    <version>1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.johnzon</groupId>
    <artifactId>johnzon-jsonb</artifactId>
    <version>1.1.4</version>
</dependency>

Die neuesten Versionen finden Sie unter Maven Central.

5. API-Funktionen

Die API enthält Anmerkungen zum Anpassen der Serialisierung/Deserialisierung.

Erstellen Sie eine einfache Klasse und sehen Sie, wie die Beispielkonfiguration aussieht:

public class Person {

    private int id;

    @JsonbProperty("person-name")
    private String name;

    @JsonbProperty(nillable = true)
    private String email;

    @JsonbTransient
    private int age;

    @JsonbDateFormat("dd-MM-yyyy")
    private LocalDate registeredDate;

    private BigDecimal salary;

    @JsonbNumberFormat(locale = "en__US", value = "#0.0")
    public BigDecimal getSalary() {
        return salary;
    }

   //standard getters and setters
}

Nach der Serialisierung sieht ein Objekt dieser Klasse folgendermaßen aus:

{
   "email":"[email protected]",
   "id":1,
   "person-name":"Jhon",
   "registeredDate":"07-09-2019",
   "salary":"1000.0"
}

Die hier verwendeten Anmerkungen sind:

  • @ JsonbProperty - wird zur Angabe eines benutzerdefinierten Feldnamens verwendet

  • @ JsonbTransient - wenn das Feld während ignoriert werden soll

Deserialisierung/Serialisierung ** @ JsonbDateFormat - wenn wir das Anzeigeformat des festlegen möchten

Datum ** @ JsonbNumberFormat - zum Festlegen des Anzeigeformats für numerische Werte

Werte ** @ JsonbNillable - Ermöglicht die Serialisierung von Nullwerten

5.1. Serialisierung und Deserialisierung

Um die JSON-Darstellung unseres Objekts zu erhalten, müssen wir zunächst die JsonbBuilder -Klasse und ihre toJson () -Methode verwenden.

Um zu beginnen, erstellen wir ein einfaches Person -Objekt wie folgt:

Person person = new Person(
  1,
  "Jhon",
  "[email protected]",
  20,
  LocalDate.of(2019, 9, 7),
  BigDecimal.valueOf(1000));

Und instanziieren Sie die Jsonb -Klasse:

Jsonb jsonb = JsonbBuilder.create();

Dann verwenden wir die toJson -Methode:

String jsonPerson = jsonb.toJson(person);

Um die folgende JSON-Darstellung zu erhalten:

{
    "email":"[email protected]",
    "id":1,
    "person-name":"Jhon",
    "registeredDate":"07-09-2019",
    "salary":"1000.0"
}

Wenn Sie die Konvertierung anders durchführen möchten, können Sie die fromJson -Methode verwenden:

Person person = jsonb.fromJson(jsonPerson, Person.class);

Natürlich können wir auch Sammlungen bearbeiten:

List<Person> personList = Arrays.asList(...);
String jsonArrayPerson = jsonb.toJson(personList);

Um die folgende JSON-Darstellung zu erhalten:

----[
    {
      "email":"[email protected]",
      "id":1,
      "person-name":"Jhon",
      "registeredDate":"09-09-2019",
      "salary":"1000.0"
    },
    {
      "email":"[email protected]",
      "id":2,
      "person-name":"Jhon",
      "registeredDate":"09-09-2019",
      "salary":"1500.0"
    },
    ...]----

Um von einem JSON-Array in List zu konvertieren, verwenden wir die fromJson -API:

List<Person> personList = jsonb.fromJson(
  personJsonArray,
  new ArrayList<Person>(){}.getClass().getGenericSuperclass()
);

5.2. Benutzerdefinierte Zuordnung mit JsonbConfig

Mit der Klasse JsonbConfig können wir den Mapping-Prozess für alle Klassen anpassen.

Beispielsweise können wir die Standard-Namensstrategien oder die Eigenschaftsreihenfolge ändern.

Jetzt verwenden wir die Strategie LOWER CASE WITH UNDERSCORES__:

JsonbConfig config = new JsonbConfig().withPropertyNamingStrategy(
  PropertyNamingStrategy.LOWER__CASE__WITH__UNDERSCORES);
Jsonb jsonb = JsonbBuilder.create(config);
String jsonPerson = jsonb.toJson(person);

Um die folgende JSON-Darstellung zu erhalten:

{
   "email":"[email protected]",
   "id":1,
   "person-name":"Jhon",
   "registered__date":"07-09-2019",
   "salary":"1000.0"
}

Jetzt ändern wir die Eigenschaftsreihenfolge mit der Strategie REVERSE . Bei Verwendung dieser Strategie ist die Reihenfolge der Eigenschaften in umgekehrter Reihenfolge zur lexikografischen Reihenfolge. Dies kann auch zur Kompilierzeit mit der Anmerkung __@JsonbPropertyOrder konfiguriert werden. Lassen Sie uns dies in Aktion sehen:

JsonbConfig config
  = new JsonbConfig().withPropertyOrderStrategy(PropertyOrderStrategy.REVERSE);
Jsonb jsonb = JsonbBuilder.create(config);
String jsonPerson = jsonb.toJson(person);

Um die folgende JSON-Darstellung zu erhalten:

{
    "salary":"1000.0",
    "registeredDate":"07-09-2019",
    "person-name":"Jhon",
    "id":1,
    "email":"[email protected]"
}

5.3. Benutzerdefinierte Zuordnung mit Adaptern

Wenn die Anmerkungen und die JsonbConfig -Klasse für uns nicht genug sind, können wir Adapter verwenden.

Um sie verwenden zu können, müssen Sie die Schnittstelle JsonbAdapter implementieren, die die folgenden Methoden definiert:

adaptToJson - Mit dieser Methode können wir eine benutzerdefinierte Konvertierungslogik verwenden

für den Serialisierungsprozess.

  • adaptFromJson - Diese Methode ermöglicht die Verwendung benutzerdefinierter Konvertierungslogik

für den Deserialisierungsprozess.

Lassen Sie uns einen PersonAdapter erstellen, um die Attribute id und name der Person -Klasse zu verarbeiten:

public class PersonAdapter implements JsonbAdapter<Person, JsonObject> {

    @Override
    public JsonObject adaptToJson(Person p) throws Exception {
        return Json.createObjectBuilder()
          .add("id", p.getId())
          .add("name", p.getName())
          .build();
    }

    @Override
    public Person adaptFromJson(JsonObject adapted) throws Exception {
        Person person = new Person();
        person.setId(adapted.getInt("id"));
        person.setName(adapted.getString("name"));
        return person;
    }
}

Außerdem weisen wir den Adapter unserer JsonbConfig -Instanz zu:

JsonbConfig config = new JsonbConfig().withAdapters(new PersonAdapter());
Jsonb jsonb = JsonbBuilder.create(config);

Und wir erhalten die folgende JSON-Darstellung:

{
    "id":1,
    "name":"Jhon"
}

6. Fazit

In diesem Lernprogramm haben wir ein Beispiel für die Integration der JSON-B-API in Java-Anwendungen mit den verfügbaren Implementierungen sowie Beispiele für das Anpassen der Serialisierung und Deserialisierung während des Kompilierens und der Laufzeit beschrieben.

Der vollständige Code ist wie immer verfügbar: over on Github .