4

gsonを使用して、JSON表現からPOJOオブジェクトを逆シリアル化します。

POJOの1つのフィールドの1つに任意のJSONデータを含めたいのですが。例えば:

class B {
    public String stringField;
    public JsonObject jsonField;
}

Gson.fromJson(json, B.class)次のJSONを呼び出せるようにしたいと思います。

{
    "stringField": "booger",
    "jsonField" :
    {
        "arbitraryField1": "foo"
    }
}

結果には、値B.jsonFieldがのJsonObjectが含まれます。arbitraryFieldfoo

ただし、これを実行しようとすると、jsonFieldは常に空のオブジェクト({})になります。実際、より一般的には、以下は常に空のオブジェクトを返すように見えます。

new Gson().fromJson("{ foo: 1 }", JsonObject.class)

foo上記では、値1という名前のフィールドを含むオブジェクトが返されると思います。

jsonをPOJOSに逆シリアル化するときに、gsonに任意のjsonデータを保持させるにはどうすればよいですか?

4

3 に答える 3

3

JsonObjectを含むラッパーオブジェクトを導入し、元のjsonを返すだけのそのオブジェクトのカスタムデシリアライザーを作成することで、この問題を回避することができました。しかし、もっと良い方法があるに違いないようです。

後世のために、デシリアライザーとトリビアルラッパーオブジェクトは次のようになります。

class MyJsonObjectWrapperDeserializer implements JsonDeserializer<MyJsonObjectWrapper> {
    @Override
    public MyJsonObjectWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return new MyJsonObjectWrapper(json.getAsJsonObject());
    }
}

class MyJsonObjectWrapper {
    public JsonObject json;

    public MyJsonObjectWrapper(JsonObject json) {
        this.json = json;
    }
}
于 2012-09-12T04:08:38.950 に答える
3

JsonParserを使用できます。

JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{ \"foo\": \"1\" }").getAsJsonObject();
于 2012-09-12T06:09:03.037 に答える
2

このデシリアライザーについて考えてみましょう。これは、私のドキュメントの解釈です。

import com.google.gson.*;
import java.lang.reflect.Type;

class B {
    public String stringField;
    public JsonObject jsonField;
}

class BDeserializer implements JsonDeserializer<B> {
    public B deserialize(JsonElement json, Type typeOfT, 
                         JsonDeserializationContext context)
                 throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();

        B b = new B();
        b.stringField = jsonObject.get("stringField").getAsString();
        b.jsonField = jsonObject.getAsJsonObject("jsonField"); 

        return b;
    }
}

public class Test {
    static public void main(String[] args) {
        GsonBuilder gson = new GsonBuilder();
        gson.registerTypeAdapter(B.class, new BDeserializer());

        String json = " { \"stringField\" : \"booger\", \"jsonField\" : { \"arbitraryField1\" : \"foo\" } } ";

        B b = gson.create().fromJson(json, B.class);
        System.out.println(b.stringField);
        System.out.println(b.jsonField.toString());
    }
}
于 2012-09-12T04:30:25.887 に答える