GSON 2.0+从两个不同的序列化字段名称中反序列化字段

时间:2014-06-15 20:12:22

标签: java serialization deserialization gson json-deserialization

在我的Java类中,我有一个声明如下的字段:

protected double a = 0.0;

在反序列化以重建此类的JSON中,该字段可以显示为两个不同名称之一(遗留问题)。例如,JSON字段可能如下所示:

"a": 9.57,

或者像这样:

"d": 9.57,

(幸运的是,遗留名称“d”不会导致与任何其他变量的命名冲突。)

我的问题是我需要使用JSON键“a”或“d”填充类字段“a” - 无论哪个存在。 (我相信它们总是相互排斥,但我实际上并没有毫无疑问地证明这一点。)

我在Netbeans中使用Gson 2.2.1和Java 7.

2 个答案:

答案 0 :(得分:2)

2015年10月, Gson版本2.4 changelog)添加了在反序列化时为@SerializedName使用备用/多个名称的功能。不再需要自定义TypeAdapter了!

<强>用法:

@SerializedName(value="default_name", alternate={"name", "firstName", "userName"})
public String name;

示例:

@SerializedName(value="a", alternate={"d"})
public double a;

https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html

答案 1 :(得分:1)

您需要JsonDeserializer,您可以在其中检查JSON字符串中的特定键,并根据其存在情况,只需在自定义POJO类中设置值,如下所示。

有关详细信息,请查看GSON Deserialiser Example

示例代码:

class MyJSONObject {
    protected double a = 0.0;

    public double getA() {
        return a;
    }

    public void setA(double a) {
        this.a = a;
    }

}

class MyJSONObjectDeserializer implements JsonDeserializer<MyJSONObject> {

    @Override
    public MyJSONObject deserialize(final JsonElement json, final Type typeOfT,
            final JsonDeserializationContext context) throws JsonParseException {

        JsonObject jsonObject = json.getAsJsonObject();

        MyJSONObject object = new MyJSONObject();

        if (jsonObject.get("a") != null) {
            object.setA(jsonObject.get("a").getAsDouble());
        } else if (jsonObject.get("d") != null) {
            object.setA(jsonObject.get("d").getAsDouble());
        }

        return object;
    }
}

...

String json = "{\"a\":\"9.57\"}";
// String json = "{\"d\":\"9.57\"}";
MyJSONObject data = new GsonBuilder()
        .registerTypeAdapter(MyJSONObject.class, new MyJSONObjectDeserializer()).create()
        .fromJson(json, MyJSONObject.class);

System.out.println(data.getA());