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 .