översikt
denna handledning fokuserar på att förstå Jackson ObjectMapper-klassen och hur man serialiserar Java-objekt till JSON och deserialiserar JSON-strängen i Java-objekt.
för att förstå mer om Jackson-biblioteket i allmänhet är Jackson-handledningen ett bra ställe att börja.,
ytterligare läsning:
arv med Jackson
Jackson JSON visningar
Jackson – Custom Serializer
beroenden
låt oss först lägga till följande beroenden i pom.xml:
detta beroende kommer också att lägga till följande bibliotek i classpath:
- jackson-annoteringar
- jackson-core
använd alltid de senaste versionerna från Maven central repository för jackson-databind.
läsa och skriva med ObjectMapper
låt oss börja med de grundläggande Läs-och skrivoperationerna.,
Objectmappers enkla readValue API är en bra ingångspunkt. Vi kan använda den för att tolka eller avserialisera JSON innehåll till ett Java objekt.
på skrivsidan kan vi också använda writeValue API för att serialisera alla Java-objekt som JSON-utdata.
vi använder följande bilklass med två fält som objekt för att serialisera eller deserialisera i hela den här artikeln:
public class Car { private String color; private String type; // standard getters setters}
3.1., Java Object to JSON
låt oss se ett första exempel på serialisering av ett Java-objekt till JSON med hjälp av writeValue-metoden för ObjectMapper-klassen:
utgången av ovanstående i filen kommer att vara:
{"color":"yellow","type":"renault"}
metoderna writevalueasstring och writevalueasbytes av objectmapper-klassen genererar en JSON från ett Java-objekt och returnerar den genererade JSON som en sträng eller som en byte-array:
String carAsString = objectMapper.writeValueAsString(car);
3.2., JSON to Java Object
nedan är ett enkelt exempel på att konvertera en JSON-sträng till ett Java-objekt med ObjectMapper-klassen:
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";Car car = objectMapper.readValue(json, Car.class);
readValue () – funktionen accepterar även andra former av inmatning, till exempel en fil som innehåller JSON string:
Car car = objectMapper.readValue(new File("src/test/resources/json_car.json"), Car.class);
eller en URL:
Car car = objectMapper.readValue(new File("src/test/resources/json_car.json"), Car.class);
eller en URL:
Car car = objectMapper.readValue(new URL("file:src/test/resources/json_car.json"), Car.class);
3.3. JSON till Jackson jsonnode
Alternativt kan en JSON tolkas till ett jsonnode-objekt och användas för att hämta data från en specifik nod:
3.4., Skapa en Java-lista från en JSON-Matrissträng
vi kan tolka en JSON i form av en array i en Java-objektlista med en TypeReference:
3.5. Skapa Java-karta från JSON String
på samma sätt kan vi tolka en JSON till en Java-karta:
avancerade funktioner
en av Jackson-bibliotekets största styrkor är den mycket anpassningsbara serialiserings-och deserialiseringsprocessen.,
i det här avsnittet går vi igenom några avancerade funktioner där input eller output JSON-svaret kan skilja sig från objektet som genererar eller förbrukar svaret.
4.1., Konfigurera serialisering eller deserialisering funktion
när du konverterar JSON-objekt till Java-klasser, om JSON strängen har några nya fält, standardprocessen kommer att resultera i ett undantag:
String jsonString = "{ \"color\" : \"Black\", \"type\" : \"Fiat\", \"year\" : \"1970\" }";
JSON strängen i exemplet ovan i standard parsningsprocessen till JSON strängen.Java-objekt för Klassbilen kommer att resultera i undantaget orecognizedpropertyexception.,
genom konfigurationsmetoden kan vi utöka standardprocessen för att ignorera de nya fälten:
ännu ett alternativ är baserat på FAIL_ON_NULL_FOR_PRIMITIVES, som definierar om null-värdena för primitiva värden är tillåtna:
objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
på samma sätt kan fail_on_numbers_for_enum-kontroller om enum-värden tillåts serialiseras/deserialized as numbers:
objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, false);
Du kan hitta den omfattande listan över serialisering och deserialisering funktioner på den officiella webbplatsen.
4.2., Skapa Anpassad Serializer eller Deserializer
en annan viktig funktion i ObjectMapper klassen är möjligheten att registrera en anpassad serializer och deserializer.
anpassade serialiserare och deserialiserare är mycket användbara i situationer där inmatningen eller utdata JSON-svaret är annorlunda i struktur än Java-klassen i vilken den måste serialiseras eller deserialiseras.,
nedan är ett exempel på en anpassad JSON serializer:
den här anpassade serialiseraren kan åberopas så här:
så här ser bilen ut (som JSON-utgång) på klientsidan:
var carJson = {"car_brand":"renault"}
och här är ett exempel på en anpassad JSON deserializer:
denna anpassade deserializer kan anropas på detta sätt:
4.3. Hantera datumformat
standard serialisering av java.util.Datum ger ett nummer, i.,e., epok tidsstämpel (antal millisekunder sedan 1 januari 1970, UTC). Men det här är inte särskilt mänskligt läsbart och kräver ytterligare omvandling som ska visas i ett läsbart format.
låt oss slå in bilinstansen som vi använde hittills i Förfrågningsklassen med den datepurchased egenskapen:
public class Request { private Car car; private Date datePurchased; // standard getters setters}
för att styra Strängformatet för ett datum och ställa in det till, t.ex., yyyy-MM-DD HH:mm A z, överväga följande utdrag:
för att lära dig mer om serialiseringsdatum med Jackson, läs vår mer djupgående uppskrivning.
4.4., Hantering Samlingar
en annan liten men användbar funktion tillgänglig genom DeserializationFeature klassen är möjligheten att generera den typ av samling vi vill ha från en JSON Array svar.
till exempel kan vi generera resultatet som en array:
eller som en lista:
Mer information om hantering av samlingar med Jackson finns här.
slutsats
Jackson är en solid och mogen JSON serialisering / deserialisering bibliotek för Java., ObjectMapper API ger ett enkelt sätt att tolka och generera JSON-svarsobjekt med stor flexibilitet. Denna artikel diskuterade de viktigaste funktionerna som gör biblioteket så populärt.