Inleiding tot de JSON Binding API (JSR 367) in Java

1. Overzicht

Lange tijd was er geen standaard voor JSON-verwerking in Java. De meest gebruikte bibliotheken voor JSON-verwerking zijn Jackson en Gson.

Onlangs kwam Java EE7 met een API voor het parseren en genereren van JSON (JSR 353: Java API voor JSON-verwerking).

En tot slot, met de release van JEE 8, is er een gestandaardiseerde API (JSR 367: Java API for JSON Binding (JSON-B)).

Voorlopig zijn de belangrijkste implementaties Eclipse Yasson (RI) en Apache Johnzon.

2. JSON-B API

2.1. Afhankelijkheid van Maven

Laten we beginnen met het toevoegen van de nodige afhankelijkheid.

Houd er rekening mee dat het in veel gevallen voldoende zal zijn om de afhankelijkheid voor de gekozen implementatie en het javax.json.bind-api wordt transitief opgenomen:

 javax.json.bind javax.json.bind-api 1.0 

De meest recente versie is te vinden op Maven Central.

3. Eclipse Yasson gebruiken

Eclipse Yasson is de officiële referentie-implementatie van JSON Binding API (JSR-367).

3.1. Afhankelijkheid van Maven

Om het te gebruiken, moeten we de volgende afhankelijkheden opnemen in ons Maven-project:

 org.eclipse yasson 1.0.1 org.glassfish javax.json 1.1.2 

De meest recente versies zijn te vinden op Maven Central.

4. Apache Johnzon gebruiken

Een andere implementatie die we kunnen gebruiken is Apache Johnzon die voldoet aan de JSON-P (JSR-353) en JSON-B (JSR-367) API's.

4.1. Afhankelijkheid van Maven

Om het te gebruiken, moeten we de volgende afhankelijkheden opnemen in ons Maven-project:

 org.apache.geronimo.specs geronimo-json_1.1_spec 1.0 org.apache.johnzon johnzon-jsonb 1.1.4 

De meest recente versies zijn te vinden op Maven Central.

5. API-functies

De API biedt annotaties voor het aanpassen van serialisatie / deserialisatie.

Laten we een eenvoudige klasse maken en kijken hoe de voorbeeldconfiguratie eruit ziet:

openbare klasse Persoon {privé int id; @JsonbProperty ("persoonsnaam") private String naam; @JsonbProperty (nillable = true) privé String-e-mail; @JsonbTransient privé int leeftijd; @JsonbDateFormat ("dd-MM-jjjj") privé LocalDate registeredDate; privé BigDecimal salaris; @JsonbNumberFormat (locale = "en_US", value = "# 0.0") openbaar BigDecimal getSalary () {terug salaris; } // standaard getters en setters}

Na serialisering ziet een object van deze klasse er als volgt uit:

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

De annotaties die hier worden gebruikt, zijn:

  • @JsonbProperty - die wordt gebruikt voor het specificeren van een aangepaste veldnaam
  • @RTLnieuws - wanneer we het veld willen negeren tijdens deserialisatie / serialisatie
  • @RTLnieuws - wanneer we het weergaveformaat van de datum willen definiëren
  • @JsonbNumberFormat - voor het specificeren van het weergaveformaat voor numerieke waarden
  • @Jonvanbuiten - voor het mogelijk maken van serialisering van null-waarden

5.1. Serialisatie en deserialisering

Om de JSON-weergave van ons object te verkrijgen, moeten we allereerst de JsonbBuilder klasse en zijn toJson () methode.

Laten we om te beginnen een eenvoudig Persoon object als dit:

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

En instantieer het Jsonb klasse:

Jsonb jsonb = JsonbBuilder.create ();

Vervolgens gebruiken we de naar Json methode:

String jsonPerson = jsonb.toJson (persoon);

Om de volgende JSON-weergave te verkrijgen:

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

Als we de conversie op de andere manier willen doen, kunnen we de van Json methode:

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

Uiteraard kunnen wij ook incasso's verwerken:

Lijst personList = Arrays.asList (...); String jsonArrayPerson = jsonb.toJson (personList);

Om de volgende JSON-weergave te verkrijgen:

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

Om te converteren van JSON-array naar Lijst we zullen de van Json API:

Lijst personList = jsonb.fromJson (personJsonArray, nieuwe ArrayList () {}. GetClass (). GetGenericSuperclass ());

5.2. Aangepaste toewijzing met JsonbConfig

De JsonbConfig class stelt ons in staat het mappingproces voor alle klassen aan te passen.

We kunnen bijvoorbeeld de standaard naamgevingsstrategieën of de volgorde van eigenschappen wijzigen.

Nu gaan we de LOWER_CASE_WITH_UNDERSCORES strategie:

JsonbConfig config = nieuwe JsonbConfig (). WithPropertyNamingStrategy (PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES); Jsonb jsonb = JsonbBuilder.create (config); String jsonPerson = jsonb.toJson (persoon);

Om de volgende JSON-weergave te verkrijgen:

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

Nu gaan we de eigenschapvolgorde wijzigen met de OMGEKEERDE strategie. Met deze strategie is de volgorde van eigenschappen in omgekeerde volgorde van lexicografische volgorde.

Dit kan ook worden geconfigureerd tijdens het compileren met de annotatie @JsonbPropertyOrder. Laten we het in actie zien:

JsonbConfig config = nieuwe JsonbConfig (). WithPropertyOrderStrategy (PropertyOrderStrategy.REVERSE); Jsonb jsonb = JsonbBuilder.create (config); String jsonPerson = jsonb.toJson (persoon); 

Om de volgende JSON-weergave te verkrijgen:

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

5.3. Aangepaste mapping met adapters

Wanneer de annotaties en de JsonbConfig les is niet genoeg voor ons, we kunnen adapters gebruiken.

Om ze te kunnen gebruiken, moeten we het JsonbAdapter interface, die de volgende methoden definieert:

  • adaptToJson - Met deze methode kunnen we aangepaste conversielogica gebruiken voor het serialisatieproces.
  • adaptFromJson - Met deze methode kunnen we aangepaste conversielogica gebruiken voor het deserialisatieproces.

Laten we een PersoonAdapter om het ID kaart en naam attributen van de Persoon klasse:

public class PersonAdapter implementeert JsonbAdapter {@Override public JsonObject adaptToJson (Person p) genereert uitzondering {return Json.createObjectBuilder () .add ("id", p.getId ()) .add ("naam", p.getName ()) .bouwen(); } @Override public Person adaptFromJson (JsonObject aangepast) gooit uitzondering {Person person = new Person (); person.setId (aangepast.getInt ("id")); person.setName (aangepast.getString ("naam")); terugkeer persoon; }}

Verder zullen we de adapter toewijzen aan ons JsonbConfig voorbeeld:

JsonbConfig config = nieuwe JsonbConfig (). WithAdapters (nieuwe PersonAdapter ()); Jsonb jsonb = JsonbBuilder.create (config);

En we krijgen de volgende JSON-weergave:

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

6. Conclusie

In deze tutorial hebben we een voorbeeld gezien van hoe de JSON-B API kan worden geïntegreerd met Java-applicaties met behulp van de beschikbare implementaties, samen met voorbeelden van het aanpassen van serialisatie en deserialisatie bij zowel compileren als runtime.

De volledige code is, zoals altijd, beschikbaar op Github.