反序列化JSON包含使用GSON对象(Deserializing an object that co

2019-09-22 08:23发布

我使用GSON反序列化JSON从POJO交涉对象。

我想在我的POJO的一个领域之一,包含任意JSON数据。 例如:

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

我希望能够调用Gson.fromJson(json, B.class)以下JSON:

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

和具有所得B.jsonField包含一个JSONObject与arbitraryField值的foo

然而,当我试图做到这一点, jsonField始终是一个空对象( {} 事实上,越来越普遍,看来下面总是返回一个空的对象:

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

我期望上述返回包含一个字段名为对象foo的值1。

怎样才可以有反序列化JSON到POJO。当GSON保留任意JSON数据?

Answer 1:

我可以通过引入包含一个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;
    }
}


Answer 2:

您可以使用JsonParser:

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


Answer 3:

考虑这个解串器,这是我的解释的文档 。

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


文章来源: Deserializing an object that contains JSON using GSON
标签: java json gson