【问题标题】:GSON 2.0+ deserialize a field from either of two different serialized field namesGSON 2.0+ 从两个不同的序列化字段名称中的任何一个反序列化一个字段
【发布时间】:2014-08-05 16:30:12
【问题描述】:

在我的 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。

【问题讨论】:

    标签: java serialization deserialization gson json-deserialization


    【解决方案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());
    

    【讨论】:

    • 完美运行。谢谢!
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2015-03-24
      相关资源
      最近更新 更多