web-dev-qa-db-ja.com

Gson:直接StringをJsonObjectに変換する(POJOなし)

これを理解することができないようです。私はGSONでJSONツリーの操作を試みていますが、JsonObjectに変換する前に、文字列を変換するPOJOがわからない、または持っていない場合があります。 StringからJsonObjectに直接移動する方法はありますか?

私は以下を試しました(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])

しかしaは失敗し、JSONはエスケープされてJsonStringのみとして解析され、bは空のJsonObjectを返します。

何か案は?

275
7zark7

jsonParserを使用してください。例えば:

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

受け入れられた答えで使用されたストレートキャストの代わりにgetAsJsonObject()を使用するようにしてください:

JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();
141
maverick
String jsonStr = "{\"a\": \"A\"}";

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

最も簡単な方法は、以下に示すようにJsonPrimitiveから派生するJsonElementクラスを使用することです。

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

ちょうど同じ問題に遭遇しました。 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

これはもっと簡単な方法だと思います。

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

そして、あなたはこのようにそれを呼ぶことができるでしょう:

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

これにより、すべての休止状態のオブジェクトが自動的に変換されます。

4
Eduardo Chico

EXTJS 4.Xでデータストアのリモートソートがあるシナリオに出会いました。この場合、文字列はJSON配列(1つのオブジェクトのみ)としてサーバーに送信されます。
単純な文字列に対して以前に提示されたのと同様のアプローチは、JsonObjectよりも先にJsonArrayに変換する必要があるだけです。

クライアントからの文字列:[{"プロパティ": "COLUMN_NAME"、 "方向": "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());
1
c2willi
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
1
Maddy