Je n'arrive pas à comprendre cela. J'essaie de manipuler l'arborescence JSON dans GSON, mais j'ai un cas dans lequel je ne sais pas ou n'ai pas de POJO dans lequel convertir une chaîne, avant de convertir en JsonObject
. Est-il possible d'aller directement d'un String
à JsonObject
?
J'ai essayé ce qui suit (syntaxe 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])
mais a
échoue, le JSON est échappé et analysé comme un JsonString
uniquement, et b
renvoie un JsonObject
vide.
Des idées?
utilisez JsonParser; par exemple:
JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();
Essayez d’utiliser getAsJsonObject()
au lieu d’une distribution simple utilisée dans la réponse acceptée:
JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();
String jsonStr = "{\"a\": \"A\"}";
Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();
Le moyen le plus simple consiste à utiliser la classe JsonPrimitive
, qui dérive de JsonElement
, comme indiqué ci-dessous:
JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();
Je viens de rencontrer le même problème. Vous pouvez écrire un désérialiseur personnalisé trivial pour la classe 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();
Je crois que c'est une approche plus facile:
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;
}
}
Et vous pourrez alors l'appeler comme ceci:
Gson gson = new GsonBuilder()
.registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxyTypeAdapter())
.create();
De cette façon, tous les objets en veille prolongée seront convertis automatiquement.
Entré dans un scénario avec le tri à distance du magasin de données dans EXTJS 4.X où la chaîne est envoyée au serveur sous la forme d'un tableau JSON (d'un seul objet).
Approche similaire à celle présentée précédemment pour une chaîne simple, il suffit simplement de convertir JsonArray avant JsonObject.
Chaîne du client: [{"property": "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());
//import com.google.gson.JsonObject;
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");