web-dev-qa-db-fra.com

Gson: Convertissez directement String en JsonObject (pas de POJO)

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?

283
7zark7

utilisez JsonParser; par exemple:

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

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();
143
maverick
String jsonStr = "{\"a\": \"A\"}";

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

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();
35
Jozef Benikovský

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();
11
Dan Menes

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.

4
Eduardo Chico

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());
2
c2willi
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
1
Maddy