Frage

Kann nicht scheinen, um dies herauszufinden. Ich versuche, JSON Baum Manipulation in Gson, aber ich habe einen Fall, wo ich weiß, oder haben keine POJO einen String in, vor der Umstellung auf JsonObject zu konvertieren. Gibt es eine Möglichkeit direkt von einem String zu JsonObject gehen?

Ich habe die folgende (Scala-Syntax) versucht:

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])

aber a ausfällt, wird die JSON entkommen und als JsonString nur analysiert und b gibt eine leere JsonObject.

Irgendwelche Ideen?

War es hilfreich?

Lösung

verwenden JsonParser; zum Beispiel:

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

Andere Tipps

Versuchen getAsJsonObject() anstelle einer geraden gegossen in der akzeptierten Antwort verwendet zu verwenden:

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();

Der einfachste Weg ist es, die JsonPrimitive Klasse zu verwenden, die ergibt sich aus JsonElement, wie unten dargestellt:

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

Just begegnet das gleiche Problem. Sie können einen trivialen benutzerdefinierten Deserializer für die JsonElement Klasse schreiben:

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();

Ich glaube, dies ist ein einfacher Ansatz:

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;
    }
}

Und dann werden Sie in der Lage sein, es so zu nennen:

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

Auf diese Weise alle Hibernate Objekte automatisch konvertiert werden.

stieß auf ein Szenario mit Fern in EXTJS 4.X von Datenspeicher, wo der Sortier Zeichenfolge an den Server als JSON Array gesendet wird (von nur 1 Objekt).
Ähnlicher Ansatz zu dem, was für einen einfachen String zuvor präsentiert wird, nur um JsonArray muß Umwandlung zuerst vor JsonObject.

String von Client: [{ "Eigenschaft": "COLUMN_NAME", "Richtung": "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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top