Gson:文字列をJsonObjectに直接変換(POJOなし)


300

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

何か案は?


1
gson検証落とし穴に注意してください:stackoverflow.com/questions/43233898/...
ヴァジム・

回答:


525

JsonParserを使用します。例えば:

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

17
ughには静的な1ライナーの便利なメソッドが必要です
Blundell

43
JsonObjectへのキャストは不要で、使いやすいnew JsonParser().parse(..).getAsJsonObject();
Chriss

1
JsonParserは抽象クラスだと思います
Jatin Sehgal

1
@KevinMeredithリンクが壊れています。これを使用しください
Ninja

4
このメソッドは現在非推奨であることに注意してください。を使用しJsonParser.parseString(str).getAsJsonObject()ます。
MichaelRöhrig19年

147

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

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

2
何らかの理由で、members親キーでラップされます。次に、サンプル{"members":{"key1": "13756963814f2c594822982c0307fb81"、 "key2":true、 "key3":123456789}}
Hossain Khan

1
2.2.4のような最新のgsonライブラリを使用します。2.2.2のようなバージョンは、何らかの理由でメンバータグを追加します。
Rubin Yoo

2
JsonParser()。parse()は、Gsonの新しいバージョンでは非推奨です。使用JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()または Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
JimmyGarpehäll19年

54
String jsonStr = "{\"a\": \"A\"}";

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

あなたはgsonによってjsonobjectに変換リストデータのGSONの道と私の答えを検証することができ stackoverflow.com/questions/18442452/...
LOG_TAG

3
私はあなたの答えを検証しました。
Purushotham 2014

@knoxxs、あなたはJsonObjectクラス定義を意味しますか?これは、GoogleのGsonライブラリからのものです。ここでドキュメントを参照できます
プルショタム2015

これにより、引数なしのコンストラクターがないJsonElementについて不平を言うエラーが発生します。
clapas

37

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

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

2
これが最も簡単な答えで、私を助けてくれました。ありがとう!
khiner 2014

11

ちょうど同じ問題が発生しました。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();

4

私はこれがより簡単なアプローチだと思います:

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

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


3

JsonParserコンストラクタは廃止されました。代わりに静的メソッドを使用します。

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();

2

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

クライアントからの文字列:[{"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());

1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");

上記は、Key-Valueデータをgsonオブジェクトに変換する最も簡単な方法です。
Maddy

1
おかげで、私の場合、最初に必要な未解析のJSON文字列がありました。
7zark7 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.