Gson: Bezpośrednio przekonwertuj ciąg na JsonObject (bez POJO)


300

Nie mogę tego rozgryźć. Próbuję manipulować drzewem JSON w GSON, ale mam przypadek, w którym nie wiem lub nie mam POJO do konwersji łańcucha, przed konwersją na JsonObject. Czy istnieje sposób, aby przejść bezpośrednio z Stringdo JsonObject?

Próbowałem następujące (składnia Scala):

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])

ale akończy się niepowodzeniem, JSON jest usuwany i analizowany jako JsonStringjedyny i bzwraca wartość pustą JsonObject.

Jakieś pomysły?


1
Uwaga na pułapki związane z walidacją gsonów: stackoverflow.com/questions/43233898/...
Vadzim

Odpowiedzi:


525

użyj JsonParser; na przykład:

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

17
Ugh powinien mieć statyczną wygodę dla 1 liniowca
Blundell,

43
obsada JsonObject jest niepotrzebna, lepsze wykorzystanienew JsonParser().parse(..).getAsJsonObject();
Chriss

1
Chyba JsonParser to klasa abstrakcyjna
Jatin Sehgal

1
@KevinMeredith link jest uszkodzony, należy to proszę
Ninja

4
Zauważ, że ta metoda jest teraz przestarzała. Zastosowanie JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig

147

Spróbuj użyć getAsJsonObject()zamiast prostej obsady użytej w zaakceptowanej odpowiedzi:

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

2
Z jakiegoś powodu zawija się w membersklucz nadrzędny. Oto przykład {„członkowie”: {„klucz1”: „13756963814f2c594822982c0307fb81”, „klucz2”: prawda, „klucz3”: 123456789}}
Hossain Khan

1
Użyj najnowszej biblioteki gson, takiej jak 2.2.4. Wersja taka jak 2.2.2 z jakiegoś powodu dodaje tag członków.
Rubin Yoo,

2
JsonParser (). Parse () jest przestarzały w nowszych wersjach Gson. Użyj JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()lub 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();

czy możesz zweryfikować moją odpowiedź za pomocą metody GSON do konwersji danych listy do jsonobject przez gson stackoverflow.com/questions/18442452/...
LOG_TAG

3
Zweryfikowałem twoją odpowiedź.
Purushotham

@knoxxs, masz na myśli JsonObjectdefinicję klasy? Pochodzi z biblioteki Google Gson. Możesz zapoznać się z dokumentacją tutaj .
Purushotham,

Daje mi to błąd narzekania, że ​​JsonElement nie ma konstruktora bez argumentu.
clapas

37

Najprostszym sposobem jest użycie JsonPrimitiveklasy, z której wywodzi się JsonElement, jak pokazano poniżej:

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

2
To najprostsza odpowiedź i pomogła mi. Dzięki!
khiner

11

Właśnie napotkałem ten sam problem. Możesz napisać trywialny niestandardowy deserializator dla JsonElementklasy:

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

Uważam, że jest to łatwiejsze podejście:

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;
    }
}

A potem będziesz mógł to nazwać w ten sposób:

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

W ten sposób wszystkie hibernowane obiekty zostaną przekonwertowane automatycznie.


3

JsonParserKonstruktor została zaniechana. Zamiast tego użyj metody statycznej:

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

2

Wystąpił w scenariuszu ze zdalnym sortowaniem magazynu danych w EXTJS 4.X, gdzie ciąg jest wysyłany do serwera jako tablica JSON (tylko 1 obiekt).
Podobne podejście do tego, co zostało przedstawione wcześniej dla prostego ciągu, wystarczy przekonwertować na JsonArray najpierw przed JsonObject.

Ciąg od klienta: [{„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");

Powyżej znajduje się najprostszy sposób na konwersję danych klucz-wartość na obiekt gson.
Maddy

1
Dzięki, w moim przypadku miałem niepodzielony ciąg JSON, od którego musiałem zacząć.
7zark7,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.