Gson: converte direttamente String in JsonObject (no POJO)


300

Non riesco a capirlo. Sto tentando la manipolazione dell'albero JSON in GSON, ma ho un caso in cui non conosco o non ho un POJO in cui convertire una stringa, prima della conversione JsonObject. C'è un modo per andare direttamente da a Stringa JsonObject?

Ho provato il seguente (sintassi 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])

ma anon riesce, il JSON viene salvato e analizzato come JsonStringunico e brestituisce un valore vuoto JsonObject.

Qualche idea?


1
Attenzione alle insidie di validazione GSON: stackoverflow.com/questions/43233898/...
Vadzim

Risposte:


525

usa JsonParser; per esempio:

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

17
ugh dovrebbe avere un metodo di praticità statico da 1 linea
Blundell,

43
il cast di JsonObject non è necessario, meglio usarlonew JsonParser().parse(..).getAsJsonObject();
Chriss,

1
Immagino che JsonParser sia una classe astratta
Jatin Sehgal il

1
@KevinMeredith il tuo collegamento è interrotto, usa questo per favore
Ninja

4
Si noti che questo metodo è ora obsoleto. Usa JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig,

147

Prova a usare getAsJsonObject()invece di un cast diretto usato nella risposta accettata:

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

2
Per qualche motivo si avvolge con membersla chiave genitore. Ecco un esempio {"members": {"key1": "13756963814f2c594822982c0307fb81", "key2": true, "key3": 123456789}}
Hossain Khan,

1
Usa l'ultima libreria gson, come 2.2.4. La versione come 2.2.2 aggiunge il tag membri per qualche motivo.
Rubin Yoo,

2
JsonParser (). Parse () è obsoleto nelle versioni più recenti di Gson. Usa JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()o Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
Jimmy Garpehäll il

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

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

si può convalidare la mia risposta con il modo GSON per i dati Elenco convertito al JsonObject da GSON stackoverflow.com/questions/18442452/...
LOG_TAG

3
Ho convalidato la tua risposta.
Purushotham,

@knoxxs, intendi la JsonObjectdefinizione di classe? Viene dalla libreria Gson di Google. Puoi consultare la documentazione qui .
Purushotham,

Questo mi dà un errore lamentandomi che JsonElement non ha un costruttore no-arg.
Clapas,

37

Il modo più semplice è utilizzare la JsonPrimitiveclasse da cui deriva JsonElement, come mostrato di seguito:

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

2
Questa è la risposta più semplice e mi ha aiutato. Grazie!
khiner,

11

Ho appena riscontrato lo stesso problema. Puoi scrivere un banale deserializzatore personalizzato per la JsonElementclasse:

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

Credo che questo sia un approccio più semplice:

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

E poi sarai in grado di chiamarlo così:

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

In questo modo tutti gli oggetti in letargo verranno convertiti automaticamente.


3

Il JsonParsercostruttore è stato deprecato. Utilizzare invece il metodo statico:

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

2

È arrivato attraverso uno scenario con l'ordinamento remoto dell'archivio dati in EXTJS 4.X in cui la stringa viene inviata al server come un array JSON (di solo 1 oggetto).
Approccio simile a quello presentato in precedenza per una stringa semplice, è sufficiente convertirlo in JsonArray prima di JsonObject.

Stringa dal 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");

Sopra è il modo più semplice per convertire i dati dei valori-chiave in oggetti gson.
Maddy,

1
Grazie, nel mio caso avevo una stringa JSON non analizzata da cui dovevo iniziare.
7zark7,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.