JSON字符串多字段反序列化为同一属性实现
在进行JSON字符串反序列化为Java对象的时候,有时候会出现多个不同的key名反序列化为同一Java对象属性的情况,如下:
JSON字符串示例
String json1 = "{\"aaa\":\"hello\"}";
String json1 = "{\"bbb\":\"world\"}";
Java对象
public class MyObject {
private String aaa;
// getter / setter
}
目标
将json1 中的aaa 和json2 中的bbb 都反序列化为MyObject 对象的aaa 属性
解决方案
Fastjson2(推荐)
import com.alibaba.fastjson2.annotation.JSONField;
public class MyObject {
@JSONField(name = "aaa", alternateNames = {"bbb"})
private String aaa;
// getter / setter
}
使用示例
String json1 = "{\"aaa\":\"hello\"}";
String json2 = "{\"bbb\":\"world\"}";
MyObject o1 = JSON.parseObject(json1, MyObject.class);
MyObject o2 = JSON.parseObject(json2, MyObject.class);
System.out.println(o1.getAaa()); // hello
System.out.println(o2.getAaa()); // world
注意事项
Fastjson 1.x 不支持alternateNames
| 版本 | 是否支持 |
|---|---|
| fastjson 1.x | ❌ 不支持 |
| fastjson2 | ✅ 支持 |
多个备选字段名
@JSONField(name = "aaa", alternateNames = {"bbb", "abc", "ddd"})
private String aaa;
如果JSON串中同时存在aaa和bbb怎么办
Fastjson2 的行为是
● 后面的字段覆盖前面的
● 不保证顺序,业务上避免这种情况
不推荐的做法
| 方式 | 原因 |
|---|---|
写两个字段 + @JSONField |
冗余、维护困难 |
| 自定义反序列化 | 成本高,没必要 |
手动 JSONObject 判断 |
失去类型安全 |
正文到此结束
- 本文标签: Java json 反序列化
- 本文链接: https://www.iquanzi.top/article/16
- 版权声明: 本文由张华永原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权