Gson: convierte directamente String a JsonObject (sin POJO)


301

Parece que no puedo resolver esto. Estoy intentando la manipulación del árbol JSON en GSON, pero tengo un caso en el que no sé o tengo un POJO para convertir una cadena, antes de convertirla JsonObject. ¿Hay alguna manera de ir directamente de un Stringa JsonObject?

He intentado lo siguiente (sintaxis 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])

pero afalla, el JSON se escapa y se analiza como JsonStringúnico, y bdevuelve un vacío JsonObject.

¿Algunas ideas?


1
Tenga cuidado con los problemas de validación de gson: stackoverflow.com/questions/43233898/…
Vadzim

Respuestas:


526

use JsonParser; por ejemplo:

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

17
ugh debería tener un método de conveniencia estático de 1 línea
Blundell

43
el reparto a JsonObject es innecesario, mejor usonew JsonParser().parse(..).getAsJsonObject();
Chriss

1
Supongo que JsonParser es una clase abstracta
Jatin Sehgal

1
@KevinMeredith tu enlace está roto, usa esto por favor
Ninja

44
Tenga en cuenta que este método ahora está en desuso. Uso JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig

147

Intente usar en getAsJsonObject()lugar de un molde directo usado en la respuesta aceptada:

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

2
Por alguna razón, se envuelve con membersla clave principal. Aquí hay una muestra {"miembros": {"clave1": "13756963814f2c594822982c0307fb81", "clave2": verdadero, "clave3": 123456789}}
Hossain Khan

1
Use la última biblioteca de gson, como 2.2.4. La versión como 2.2.2 agrega la etiqueta de miembros por alguna razón.
Rubin Yoo

2
JsonParser (). Parse () está en desuso en las versiones más nuevas de Gson. Use JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()or 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();

¿puede validar mi respuesta con GSON way para convertir los datos de la lista a jsonobject por gson stackoverflow.com/questions/18442452/…
LOG_TAG

3
He validado tu respuesta.
Purushotham

@knoxxs, ¿te refieres a JsonObjectla definición de clase? Proviene de la biblioteca Gson de Google. Puede consultar la documentación aquí .
Purushotham

Esto me da un error al quejarme de que JsonElement no tiene un constructor sin argumentos.
clapas

37

La forma más simple es usar la JsonPrimitiveclase, que se deriva de JsonElement, como se muestra a continuación:

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

2
Esta es la respuesta más simple y me ayudó. ¡Gracias!
khiner

11

Acabo de encontrar el mismo problema. Puede escribir un deserializador personalizado trivial para la JsonElementclase:

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

Creo que este es un enfoque más fácil:

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

Y luego podrás llamarlo así:

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

De esta forma, todos los objetos de hibernación se convertirán automáticamente.


3

El JsonParserconstructor ha quedado en desuso. Utilice el método estático en su lugar:

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

2

Encontré un escenario con clasificación remota del almacén de datos en EXTJS 4.X donde la cadena se envía al servidor como una matriz JSON (de solo 1 objeto).
Enfoque similar a lo que se presenta previamente para una cadena simple, solo necesita conversión a JsonArray primero antes de JsonObject.

Cadena del cliente: [{"propiedad": "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");

Arriba está la forma más fácil de convertir sus datos de valor clave a objeto gson.
Maddy

1
Gracias, en mi caso tenía una cadena JSON no analizada de la que necesitaba comenzar.
7zark7
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.