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.