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?

7zark7
fuente
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();
Dallan Quass
fuente
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();
disidente
fuente
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();
Purushotham
fuente
¿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();
Jozef Benikovský
fuente
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();
Dan Menes
fuente
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.

Eduardo Chico
fuente
3

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

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