simple - string to json java spring
Gson: Convierte directamente String a JsonObject(no POJO) (8)
Acabo de encontrar el mismo problema. Puede escribir un deserializador personalizado 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();
Parece que no puedo resolver esto. Estoy intentando manipular el árbol JSON en GSON, pero tengo un caso en el que no sé o tengo un POJO para convertir una cadena, antes de convertir a JsonObject
. ¿Hay una manera de ir directamente de una String
a JsonObject
?
He intentado lo siguiente (sintaxis de 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 escapa y se analiza solo como JsonString
, y b
devuelve un JsonObject
vacío.
¿Algunas ideas?
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 podrás llamarlo 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.
La forma más sencilla es usar la clase JsonPrimitive
, que se deriva de JsonElement
, como se muestra a continuación:
JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();
Llegó a través de un escenario con la 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).
Un enfoque similar a lo que se presenta anteriormente para una cadena simple, solo necesita la conversión a JsonArray primero antes de JsonObject.
Cadena del cliente: [{"propiedad": "COLUMN_NAME", "dirección": "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());
Trate de usar getAsJsonObject () en lugar de un lanzamiento directo utilizado en la respuesta aceptada:
JsonObject o = new JsonParser().parse("{/"a/": /"A/"}").getAsJsonObject();
utilizar JsonParser; por ejemplo:
JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{/"a/": /"A/"}").getAsJsonObject();
//import com.google.gson.JsonObject;
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
String jsonStr = "{/"a/": /"A/"}";
Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();