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。
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
您需要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)