Gson: String direkt in JsonObject konvertieren (kein POJO)


300

Ich kann das nicht herausfinden. Ich versuche, JSON-Bäume in GSON zu manipulieren, aber ich habe einen Fall, in dem ich vor dem Konvertieren in kein POJO kenne oder kein POJO habe, in das ich einen String konvertieren kann JsonObject. Gibt es einen Weg direkt von a Stringnach JsonObject?

Ich habe Folgendes versucht (Scala-Syntax):

val gson = (new GsonBuilder).create

val a: JsonObject = gson.toJsonTree("""{ "a": "A", "b": true }""").getAsJsonObject
val b: JsonObject = gson.fromJson("""{ "a": "A", "b": true }""", classOf[JsonObject])

aWenn dies jedoch fehlschlägt, wird der JSON als JsonStringeinziger maskiert und analysiert und bgibt einen leeren Wert zurück JsonObject.

Irgendwelche Ideen?


1
Hüten Sie sich vor Fallstricken bei der Gson-Validierung: stackoverflow.com/questions/43233898/…
Vadzim

Antworten:


525

benutze JsonParser; beispielsweise:

JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();

17
ugh sollte eine statische 1-Liner-Convenience-Methode haben
Blundell

43
Die Besetzung von JsonObject ist unnötig, besser zu nutzennew JsonParser().parse(..).getAsJsonObject();
Chriss

1
Ich denke, JsonParser ist eine abstrakte Klasse
Jatin Sehgal

1
@ KevinMeredith Sie Link ist kaputt, verwenden Sie diese bitte
Ninja

4
Beachten Sie, dass diese Methode jetzt veraltet ist. Verwenden Sie JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig

147

Versuchen Sie, getAsJsonObject()anstelle einer geraden Besetzung zu verwenden, die in der akzeptierten Antwort verwendet wird:

JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();

2
Aus irgendeinem Grund wird es mit dem membersübergeordneten Schlüssel umbrochen . Hier ist ein Beispiel {"Mitglieder": {"Schlüssel1": "13756963814f2c594822982c0307fb81", "Schlüssel2": wahr, "Schlüssel3": 123456789}}
Hossain Khan

1
Verwenden Sie die neueste gson-Bibliothek wie 2.2.4. Die Version wie 2.2.2 fügt aus irgendeinem Grund ein Mitgliedertag hinzu.
Rubin Yoo

2
JsonParser (). Parse () ist in neueren Versionen von Gson veraltet. Verwenden Sie JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()oder Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
Jimmy Garpehäll

54
String jsonStr = "{\"a\": \"A\"}";

Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();

können Sie meine Antwort mit GSON Weg für die Konvertierung von Listendaten in jsonobject von gson stackoverflow.com/questions/18442452/…
LOG_TAG

3
Ich habe Ihre Antwort bestätigt.
Purushotham

@knoxxs, du meinst JsonObjectKlassendefinition? Es stammt aus der Gson-Bibliothek von Google. Die Dokumentation finden Sie hier .
Purushotham

Dies gibt mir einen Fehler, der sich darüber beschwert, dass JsonElement keinen Konstruktor ohne Argumente hat.
Clapas

37

Der einfachste Weg ist die Verwendung der JsonPrimitiveKlasse, von der abgeleitet wird JsonElement, wie unten gezeigt:

JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();

2
Dies ist die einfachste Antwort und hat mir geholfen. Vielen Dank!
Khiner

11

Ich bin gerade auf das gleiche Problem gestoßen. Sie können einen einfachen benutzerdefinierten Deserializer für die JsonElementKlasse schreiben :

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

GsonBuilder gson_builder = new GsonBuilder();
gson_builder.registerTypeAdapter(
        JsonElement.class,
        new JsonDeserializer<JsonElement>() {
            @Override
            public JsonElement deserialize(JsonElement arg0,
                    Type arg1,
                    JsonDeserializationContext arg2)
                    throws JsonParseException {

                return arg0;
            }
        } );
String str = "{ \"a\": \"A\", \"b\": true }";
Gson gson = gson_builder.create();
JsonElement element = gson.fromJson(str, JsonElement.class);
JsonObject object = element.getAsJsonObject();

4

Ich glaube, das ist ein einfacher Ansatz:

public class HibernateProxyTypeAdapter implements JsonSerializer<HibernateProxy>{

    public JsonElement serialize(HibernateProxy object_,
        Type type_,
        JsonSerializationContext context_) {
        return new GsonBuilder().create().toJsonTree(initializeAndUnproxy(object_)).getAsJsonObject();
        // that will convert enum object to its ordinal value and convert it to json element

    }

    public static <T> T initializeAndUnproxy(T entity) {
        if (entity == null) {
            throw new 
               NullPointerException("Entity passed for initialization is null");
        }

        Hibernate.initialize(entity);
        if (entity instanceof HibernateProxy) {
            entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer()
                    .getImplementation();
        }
        return entity;
    }
}

Und dann können Sie es so nennen:

Gson gson = new GsonBuilder()
        .registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxyTypeAdapter())
        .create();

Auf diese Weise werden alle Objekte im Ruhezustand automatisch konvertiert.


3

Der JsonParserKonstruktor ist veraltet. Verwenden Sie stattdessen die statische Methode:

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();

2

Kam über ein Szenario mit Remote-Sortierung des Datenspeichers in EXTJS 4.X, in dem die Zeichenfolge als JSON-Array (von nur 1 Objekt) an den Server gesendet wird.
Ein ähnlicher Ansatz wie zuvor für eine einfache Zeichenfolge, muss erst vor JsonObject in JsonArray konvertiert werden.

Zeichenfolge vom Client: [{"property": "COLUMN_NAME", "direction": "ASC"}]

String jsonIn = "[{\"property\":\"COLUMN_NAME\",\"direction\":\"ASC\"}]";
JsonArray o = (JsonArray)new JsonParser().parse(jsonIn);

String sortColumn = o.get(0).getAsJsonObject().get("property").getAsString());
String sortDirection = o.get(0).getAsJsonObject().get("direction").getAsString());

1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");

Oben ist der einfachste Weg, um Ihre Schlüsselwertdaten in ein gson-Objekt zu konvertieren.
Maddy

1
Vielen Dank, in meinem Fall hatte ich eine nicht analysierte JSON-Zeichenfolge, von der ich ausgehen musste.
7zark7
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.