JSON (Javascript Object Notation) is een verzameling van sleutel-waarde paren die eenvoudig kunnen worden geparsed en gegenereerd door applicaties. Het is een subset van de JavaScript Programmeertaal Standaard ECMA-262. Het parseren van JSON is vereist in de meeste applicaties, zoals RESTful API’s of applicaties die gegevensserialisatie nodig hebben.
In het Java-ecosysteem zijn de twee populairste bibliotheken voor het omgaan met JSON-gegevens Jackson en Gson. Beide worden veel gebruikt en bieden unieke voordelen. Dit artikel gebruikt randgevallen om de functies van beide bibliotheken op verschillende parameters te verkennen.
Korte Overzicht van Jackson en Gson
Jackson
Jackson is ontwikkeld door FasterXML en wordt gebruikt in bedrijfsapplicaties en frameworks zoals Spring Boot. Het biedt parsing, serialisatie en deserialisatie van JSON-gegevens. De volgende functies maken deze bibliotheek populair onder ontwikkelaars:
- Jackson is de standaard JSON verwerkingsbibliotheek in Spring Boot, wat handmatige configuratie in de meeste gevallen overbodig maakt.
- Het vergemakkelijkt JSON-deserialisatie naar generieke types met behulp van TypeReference of JavaType.
- Het biedt verschillende annotaties om het gedrag van serialisatie en deserialisatie aan te passen. Bijvoorbeeld,
@JsonProperty(name)
maakt de mapping tussen de binnenkomende sleutel en het daadwerkelijke Java POJO-veld naadloos. - Het biedt uitgebreide en robuuste ondersteuning voor bidirectionele gegevensbinding (JSON naar POJO en vice versa), streaming API (API leest JSON in POJO), en boommodel parsing (een in-memory map van JSON-objecten).
- De Jackson-bibliotheek biedt hoge prestaties door het minimaliseren van geheugenoverhead en het optimaliseren van serialisatie/deserialisatie (van JSON naar POJO en vice versa).
- Jackson ondersteunt aanvullende modules zoals XML-, YAML-verwerking en Kotlin-, scala-specifieke verbeteringen.
- Annotations zoals
@JsonTypeInfo
en@JsonSubTypes
behandelen polymorfe typen. - Het kan ontbrekende of extra velden in JSON-gegevens verwerken vanwege zijn achterwaartse en voorwaartse compatibiliteit.
- Jackson biedt ondersteuning voor onwijzigbare objecten en klassen met constructors, inclusief die met bouwerpatronen.
- De klasse
ObjectMapper
is thread-safe en maakt daarom efficiënt gebruik mogelijk in multithreaded toepassingen.
Gson
Gson is ontwikkeld door Google en ontworpen voor het converteren van JSON naar Java-objecten (POJO) en vice versa. Het is eenvoudig en ideaal te gebruiken voor kleinere toepassingen die snelle implementaties nodig hebben. De open-source bibliotheek biedt de volgende belangrijke functies:
- Gson heeft minimale externe afhankelijkheden; daarom is het eenvoudig te integreren.
- Het ondersteunt geneste objecten en complexe datatypen zoals lijsten, kaarten en aangepaste klassen.
- Het kan JSON deserialiseren naar generieke collecties zoals
List<T>
,Map<K,V>
met behulp van TypeToken. - De JsonSerializer en JsonDeserializer interfaces van de Gson-bibliotheek maken aangepaste implementatie mogelijk.
- Nullwaarden worden standaard uitgesloten in de JSON-uitvoer, en indien nodig kunnen nullwaarden in de uitvoer worden opgenomen.
- Annotaties
@SerializedName
koppelen JSON-sleutels aan Java-velden met verschillende namen. - De Gson-objecten zijn thread-safe en kunnen daarom worden gebruikt in multithreaded applicaties.
- De klasse GsonBuilder kan aangepaste naamgevingsbeleid voor velden toepassen. Bijvoorbeeld,
FieldNamingPolicy.IDENTITY
is het standaardbeleid, wat betekent dat de veldnaam ongewijzigd blijft.
Randgevallen in deze vergelijking in overweging genomen
Feature | Jackson | GSON |
---|---|---|
Extra velden |
Standaard genegeerd, configureerbaar. |
Standaard genegeerd. |
Nullwaarden |
Ondersteunt @JsonInclude. |
Vereist .serializeNulls(). |
Circulaire Verwijzingen |
Ondersteund met @JsonIdentityInfo. |
Niet direct ondersteund. |
Gegevensverwerking |
Ondersteunt Java 8 Date API met modules. |
Vereist adapters voor aangepaste typen. |
Polymorfisme |
Ingebouwd met @JsonTypeInfo. |
Vereist aangepaste deserialisatielogica. |
De invoer-JSON die wordt overwogen voor vergelijking met de Jackson- en Gson-bibliotheken is aanwezig op GitHub.
De modelklasrepresentatie van JSON is op GitHub.
Jackson Implementatie
De bovenstaande JSON wordt omgezet naar een Java-object met behulp van de onderstaande Jackson-bibliotheken:
<!-- Jackson START-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.18.2</version>
</dependency>
<!-- Jackson END-->
JSON Parsing main klasse met behulp van de Jackson-bibliotheek:
public class JacksonJsonMain {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
//Jackson Support for LocalDate using jackson-datatype-jsr310
mapper.registerModule(new JavaTimeModule());
//Configuration to ignore extra fields
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// Deserialize the JSON
EmployeeModelData employeeModelData = mapper.readValue(json, EmployeeModelData.class);
Employee employee=employeeModelData.getEmployee();
// display Json fields
System.out.println("Jackson Library parsing output");
System.out.println("Employee Name: " + employee.getName());
System.out.println("Department Name: " + employee.getDepartment().getName());
System.out.println("Skills: " + employee.getSkills());
System.out.println("Team Members Count: " + employeeModelData.getTeamMembers().size());
}
}
De uitvoer van de bovenstaande klasse is als volgt:
Gson Implementatie
De Gson-afhankelijkheid die wordt gebruikt om de bovenstaande JSON om te zetten naar een Java-object is hieronder:
<!--GSON START -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
<!--GSON END -->
JSON parsing met behulp van de GSON-bibliotheek main klasse:
public class GsonJsonMain {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter()) // Register LocalDate adapter
.serializeNulls() // Handle null values
.setPrettyPrinting() // Pretty print JSON
.create();
// Deserialize the JSON
EmployeeModelData data = gson.fromJson(json, EmployeeModelData.class);
// Print Employee information
System.out.println("GSON Library parsing output");
System.out.println("Employee Name: " + data.getEmployee().getName());
System.out.println("Department Name: " + data.getEmployee().getDepartment().getName());
System.out.println("Skills: " + data.getEmployee().getSkills());
System.out.println("Team Members Count: " + data.getTeamMembers().size());
}
}
De uitvoer van de bovenstaande hoofdklasse is als volgt:
Welke Moet Ik Kiezen?
Jackson biedt hoge prestaties; daarom moet het worden gebruikt wanneer projecten complexe datastructuren of grote datasets omvatten, terwijl Gson moet worden gebruikt wanneer er kleinere datasets zijn en de datastructuur eenvoudig is.
Conclusie
Beide bibliotheken kunnen effectief omgaan met de bovenstaande dataset en zijn uitstekend bij het verwerken van JSON-analyse in JAVA. De bovenstaande vergelijking helpt bij het kiezen van de juiste bibliotheek op basis van projectvereisten.
De codefragmenten die hierboven zijn genoemd, zijn beschikbaar in het GitHub-opslagplaats.
Een gedetailleerde vergelijking tussen Jackson en Gson is beschikbaar op Baeldung. De Jackson officiële documentatie biedt uitgebreide informatie over de functies en configuratie van Jackson. Op vergelijkbare wijze biedt de officiële documentatie van Gson een gedetailleide implementatiehandleiding.
Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java