Question

peut sembler ne pas comprendre cela. Je tente la manipulation des arbres JSON dans GSON, mais j'ai un cas où je ne sais pas ou d'avoir un POJO pour convertir une chaîne en, avant sa conversion en JsonObject. Est-il possible d'aller directement d'un String à JsonObject?

J'ai essayé les éléments suivants (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 JsonString seulement, et b retourne un JsonObject vide.

Toutes les idées?

Était-ce utile?

La solution

utiliser JsonParser; par exemple:

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

Autres conseils

Essayez d'utiliser getAsJsonObject() au lieu d'un casting droit utilisé 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();

La façon la plus simple est d'utiliser la classe JsonPrimitive, qui dérive de JsonElement, comme indiqué ci-dessous:

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

Juste rencontré le même problème. Vous pouvez écrire un désérialiseur trivial personnalisé 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 simple:

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 alors vous pourrez 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 sera automatiquement convertie.

tombé sur un scénario avec tri à distance de stockage de données dans ExtJs 4.X où la chaîne est envoyée au serveur en tant que tableau JSON (de seulement 1 objet).
Une approche similaire à ce qui est présenté précédemment pour une chaîne simple, il suffit besoin d'une conversion à JsonArray première avant JsonObject.

Chaîne du client: [{ "propriété": "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");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top