HOWTO · Java

String in JSON-Objekt umwandeln in Java

In diesem Tutorial wird erklärt, wie man einen String in ein JSON-Objekt in Java konvertiert

Auf dieser Seite

Um JSON-Text in Java zu verwenden, parsen Sie ihn mit einer JSON-Bibliothek. Das Parsen erzeugt einen bibliotheksspezifischen JSON-Baum, den Sie dynamisch untersuchen können; wenn Sie den Text stattdessen auf eine Java-Klasse abbilden, erhalten Sie ein typisiertes Objekt. Die drei Optionen hier sind org.json, Gson und Jackson. Jede benötigt ihre eigene Abhängigkeit. Wählen Sie einen Baum, wenn Sie Felder dynamisch untersuchen möchten, oder bilden Sie den Text auf eine Java-Klasse ab, wenn die Datenform bekannt ist und typisierte Felder nützlich sind.

Verwenden von JSONObject zum Konvertieren eines Strings in ein JSON-Objekt in Java

Die JSON-java-Bibliothek (org.json) parst einen Objekt-String mit new JSONObject(json). Fügen Sie für Maven org.json:json:20201115 innerhalb des <dependencies>-Elements der pom.xml hinzu. Der Konstruktor gibt ein JSONObject zurück; lesen Sie String- und Integer-Mitglieder mit getString("name") und getInt("age"). Diese Aufrufe geben Java-Werte zurück, während das JSONObject die JSON-Objektdarstellung der Bibliothek im Speicher bleibt. Rufen Sie Mitglieder über ihren Schlüssel ab, da die Reihenfolge der Objektmitglieder keine verlässliche semantische Eigenschaft ist.

Das folgende vollständige Beispiel verwendet new JSONObject(json), um das gemeinsame Beispiel {"name":"John","age":30} zu parsen, liest beide Felder, gibt sie aus und behandelt JSONException:

import org.json.JSONException;
import org.json.JSONObject;

public class StringToJsonObjectWithJsonOrg {
    public static void main(String[] args) {
        String json = "{\"name\":\"John\",\"age\":30}";
        try {
            JSONObject object = new JSONObject(json);
            System.out.println("name: " + object.getString("name"));
            System.out.println("age: " + object.getInt("age"));
        } catch (JSONException e) {
            System.err.println("Invalid JSON: " + e.getMessage());
        }
    }
}
name: John
age: 30

Zum Vergleich extrahiert das folgende Beispiel, das nur das JDK verwendet, ebenfalls die beiden Felder des Beispiels und gibt ihre Werte aus, wobei es nur einen regulären Ausdruck verwendet. Es ist auf diese flache Eingabeform beschränkt; es parst oder validiert kein allgemeines JSON. Die Eingabe ist in main deklariert, speichern Sie das Snippet daher als StringToJsonObject.java und kompilieren Sie es mit einem JDK.

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringToJsonObject {
    public static void main(String[] args) {
        String json = "{\"name\":\"John\",\"age\":30}";
        Pattern field = Pattern.compile("\\\"(name|age)\\\"\\s*:\\s*(?:\\\"([^\\\"]*)\\\"|(\\d+))");
        Matcher matcher = field.matcher(json);
        Map<String, String> values = new LinkedHashMap<>();
        while (matcher.find()) {
            String value = matcher.group(2) != null ? matcher.group(2) : matcher.group(3);
            values.put(matcher.group(1), value);
        }
        System.out.println("name: " + values.get("name"));
        System.out.println("age: " + values.get("age"));
    }
}
name: John
age: 30

Dieser reguläre Ausdruck deckt nur die gezeigten String- und Integer-Mitglieder ab. Er validiert keine JSON-Syntax und behandelt maskierte Anführungszeichen, verschachtelte Strukturen, Arrays oder andere JSON-Werte nicht korrekt. Verwenden Sie JSONObject oder einen anderen Parser für Anwendungseingaben und prüfen Sie, ob erforderliche Mitglieder vorhanden sind und die erwarteten Typen haben, bevor Sie sie lesen. Fangen Sie JSONException um das Parsen und typisierte Lesezugriffe, damit der Aufrufer einen Parsing- oder Wertzugriffsfehler melden oder sich davon erholen kann.

Google Gson verwenden, um einen String in ein JSON-Objekt in Java umzuwandeln

Gson kann Text in einen JSON-Baum parsen oder ihn direkt auf eine Java-Klasse abbilden. Um Felder zu untersuchen, ohne eine Klasse zu definieren, fügen Sie com.google.code.gson:gson:2.8.6 innerhalb des Maven-Elements <dependencies> hinzu. Parsen Sie einen Baum mit JsonParser.parseString(json).getAsJsonObject() und lesen Sie dann Mitglieder mit object.get("name").getAsString() und object.get("age").getAsInt(). Dies gibt einen JsonObject-Baum zurück, keine Instanz einer Domänenklasse.

Das folgende vollständige Beispiel parst dasselbe Beispiel in ein JsonObject, liest beide Felder, gibt sie aus und behandelt Parsing-Fehler:

import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;

public class StringToJsonObjectWithGson {
    public static void main(String[] args) {
        String json = "{\"name\":\"John\",\"age\":30}";
        try {
            JsonObject object = JsonParser.parseString(json).getAsJsonObject();
            System.out.println("name: " + object.get("name").getAsString());
            System.out.println("age: " + object.get("age").getAsInt());
        } catch (JsonParseException | IllegalStateException e) {
            System.err.println("Invalid JSON: " + e.getMessage());
        }
    }
}
name: John
age: 30

Wenn die Daten eine bekannte Form haben und typisierte Felder nützlich sind, definieren Sie eine User-Klasse mit den Feldern String name und int age und rufen Sie dann new Gson().fromJson(json, User.class) auf, um einen User zu erzeugen. Um diese Instanz wieder in JSON-Text zu serialisieren, rufen Sie new Gson().toJson(user) auf. GsonBuilder.setPrettyPrinting() konfiguriert die Formatierung während der Serialisierung; es ändert weder den geparsten Baum noch den Java-Wert. Behandeln Sie JsonParseException für Parsing-Probleme und validieren Sie danach erforderliche Felder, denn gültiges JSON kann Daten, die Ihr Programm benötigt, trotzdem auslassen.

Jackson verwenden, um einen String in ein JSON-Objekt umzuwandeln

Jacksons Baummodell ist nützlich, wenn Sie Felder dynamisch auswählen müssen. Fügen Sie com.fasterxml.jackson.core:jackson-databind:2.11.3 innerhalb des Maven-Elements <dependencies> hinzu. Das Artefakt jackson-databind stellt die ObjectMapper-Baum-API bereit und bringt Jackson Core als Abhängigkeit mit. Rufen Sie new ObjectMapper().readTree(json) auf, um Text in ein JsonNode, Jacksons Darstellung eines JSON-Baums, zu parsen. Lesen Sie die Beispielwerte mit node.get("name").asText() und node.get("age").asInt(); verwenden Sie für jeden Wert das passende Mitglied.

Das folgende vollständige Beispiel verwendet ObjectMapper.readTree(json), liest beide Felder, gibt sie aus und behandelt die geprüfte JsonProcessingException:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class StringToJsonObjectWithJackson {
    public static void main(String[] args) {
        String json = "{\"name\":\"John\",\"age\":30}";
        try {
            JsonNode node = new ObjectMapper().readTree(json);
            System.out.println("name: " + node.get("name").asText());
            System.out.println("age: " + node.get("age").asInt());
        } catch (JsonProcessingException e) {
            System.err.println("Invalid JSON: " + e.getMessage());
        }
    }
}
name: John
age: 30

readTree kann die geprüfte JsonProcessingException auslösen, behandeln Sie sie daher dort, wo das Parsen erfolgt. Prüfen Sie außerdem, ob jeder angeforderte Knoten vorhanden ist und den erwarteten Typ hat, bevor Sie Komfort-Accessoren wie asText() oder asInt() verwenden. Ein fehlendes oder anders typisiertes Mitglied kann sonst einen Wert erzeugen, der für die Anwendung nicht geeignet ist, selbst wenn das JSON-Dokument selbst erfolgreich geparst wurde.

Alle drei Bibliotheken parsen JSON-Text, aber ihre Baumtypen und APIs unterscheiden sich: JSONObject, JsonObject und JsonNode. Ein fehlerhaftes Dokument schlägt beim Parsen fehl, und die Ausnahme-Klasse und -Nachricht hängen von der gewählten Bibliothek ab. Parsen allein stellt nicht sicher, dass erforderliche Felder vorhanden sind oder dass Werte die von Ihrer Anwendung erwarteten Typen haben, validieren Sie sie daher vor der Verwendung. Das Beispiel mit dem regulären Ausdruck, das nur das JDK verwendet, ist auf das gezeigte flache Beispiel beschränkt; verwenden Sie für allgemeine JSON-Eingaben eine der abhängigkeitsgestützten Bibliotheks-APIs.