2010-11-05 17 views
216

Parece que no puede resolver esto. Estoy intentando la manipulación de árbol JSON en GSON, pero tengo un caso donde no sé o tengo un POJO para convertir una cadena en, antes de convertir a JsonObject. ¿Hay alguna manera de ir directamente de String a JsonObject?Gson: convierte directamente String en JsonObject (no POJO)

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 a falla, el JSON se escaparon y se analiza como una única JsonString, y b devuelve un vacío JsonObject.

¿Alguna idea?

+0

Cuidado con las trampas de validación GSON: https://stackoverflow.com/questions/43233898/how-to-check-if-json-is-valid-in-java-using-gson/47890960#47890960 – Vadzim

Respuesta

406

use JsonParser; por ejemplo:

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

ugh debería tener un método de conveniencia de 1 liner estático – Blundell

+0

no hay un ejemplo estático, pero muchos ejemplos de liner debajo de – Yaniv

+37

el lanzamiento a JsonObject es innecesario, mejor use 'new JsonParser(). parse (..). getAsJsonObject();' – Chriss

9

Acabo de encontrar el mismo problema. Puede escribir un deserializer encargo trivial para la clase JsonElement:

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(); 
+0

datos de la Lista convertir a objeto JSON por GSON http://stackoverflow.com/questions/18442452/create-an-array-of -json-objects/18443395 # 18443395 por favor, valide mi respuesta –

130

intenta utilizar getAsJsonObject() en lugar de un reparto lineal utilizado en la respuesta aceptada:

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

Por alguna razón se envuelve con la clave principal 'members'. Este es un ejemplo { \t \t "miembros": { \t \t \t "key1": "13756963814f2c594822982c0307fb81", \t \t \t "clave2": true, \t \t \t "key3": 123456789 \t \t} \t} –

+1

utilizar la última biblioteca GSON, como 2.2.4. La versión como 2.2.2 agrega la etiqueta de miembros por algún motivo. –

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

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

puede que validar mi respuesta con forma GSON de datos de la Lista convertido al JSONObject por GSON http://stackoverflow.com/questions/18442452/create-an-array-of-json-objects/18443395#18443395 –

+3

que han validado su respuesta . – Uttam

+0

¿Por qué directamente dar 'JsonObject' no está funcionando? –

1

encontramos con 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 presentó anteriormente para una cadena simple, solo necesita conversión a JsonArray primero antes de JsonObject.

Cadena de cliente: [{ "propiedad": "dirección" "COLUMN_NAME": "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()); 
21

La forma más sencilla es utilizar la clase JsonPrimitive, que deriva de JsonElement , como se muestra a continuación:

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

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

+0

Pidió JSONObject –

+0

Gracias, he modificado el ejemplo a responder a la pregunta literalmente. –

3

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 entonces usted será capaz de llamar así:

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

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

1
//import com.google.gson.JsonObject; 
JsonObject complaint = new JsonObject(); 
complaint.addProperty("key", "value"); 
+0

arriba es la forma más fácil de convertir sus datos de clave-valor al objeto gson. – Maddy

+0

Gracias, en mi caso, tenía una cadena JSON sin analizar de la que tenía que partir. – 7zark7

Cuestiones relacionadas