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

Mou*_*inX 5 java serialization gson deserialization json-deserialization

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

protected double a = 0.0;
Run Code Online (Sandbox Code Playgroud)

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

"a": 9.57,
Run Code Online (Sandbox Code Playgroud)

或者像这样:

"d": 9.57,
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mat*_*ets 5

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

用法:

@SerializedName(value="default_name", alternate={"name", "firstName", "userName"})
public String name;
Run Code Online (Sandbox Code Playgroud)

例子:

@SerializedName(value="a", alternate={"d"})
public double a;
Run Code Online (Sandbox Code Playgroud)

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


Bra*_*raj 1

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

有关更多信息,请查看GSON 反序列化器示例

示例代码:

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());
Run Code Online (Sandbox Code Playgroud)