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?

7zark7
quelle
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();
Dallan Quass
quelle
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();
Einzelgänger
quelle
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();
Purushotham
quelle
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();
Jozef Benikovský
quelle
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();
Dan Menes
quelle
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.

Eduardo Chico
quelle
3

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

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();
Stephen Paul
quelle
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());
c2willi
quelle
1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
Maddy
quelle
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