Gson: convertir directement la chaîne en JsonObject (pas de POJO)

Je n’arrive pas à comprendre ça. Je tente une manipulation d’arborescence JSON dans GSON, mais j’ai un cas où je ne connais pas ou ne possède pas de POJO dans lequel convertir une chaîne, avant de la convertir en JsonObject . Existe-t-il un moyen d’aller directement d’une Ssortingng à 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 échec, le JSON est échappé et analysé en tant que JsonSsortingng uniquement, et b renvoie un JsonObject vide.

Des idées?

utiliser JsonParser; par exemple:

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

Essayez d’utiliser getAsJsonObject () au lieu d’un cast direct utilisé dans la réponse acceptée:

 JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject(); 
 Ssortingng 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(yourSsortingng); JsonObject result = element.getAsJsonObject(); 

Juste rencontré le même problème. Vous pouvez écrire un désérialiseur personnalisé sortingvial 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() { @Override public JsonElement deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { return arg0; } } ); Ssortingng 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{ 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 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 alors vous pourrez l’appeler comme ceci:

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

De cette façon, tous les objects d’hibernation seront convertis automatiquement.

Entré dans un scénario avec le sorting à distance du magasin de données dans EXTJS 4.X où la chaîne est envoyée au serveur en tant que tableau JSON (de 1 seul object).
Une approche similaire à ce qui est présenté précédemment pour une chaîne simple nécessite simplement une conversion vers JsonArray avant JsonObject.

Chaîne du client: [{“propriété”: “COLUMN_NAME”, “direction”: “ASC”}]

 Ssortingng jsonIn = "[{\"property\":\"COLUMN_NAME\",\"direction\":\"ASC\"}]"; JsonArray o = (JsonArray)new JsonParser().parse(jsonIn); Ssortingng sortColumn = o.get(0).getAsJsonObject().get("property").getAsSsortingng()); Ssortingng sortDirection = o.get(0).getAsJsonObject().get("direction").getAsSsortingng()); 
 //import com.google.gson.JsonObject; JsonObject complaint = new JsonObject(); complaint.addProperty("key", "value");