在我的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.
答案 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());