原创

JSON字符串多字段反序列化为同一属性实现

在进行JSON字符串反序列化为Java对象的时候,有时候会出现多个不同的key名反序列化为同一Java对象属性的情况,如下:

JSON字符串示例

String json1 = "{\"aaa\":\"hello\"}";
String json1 = "{\"bbb\":\"world\"}";

Java对象

public class MyObject {

    private String aaa;

    // getter / setter
}

目标

json1 中的aaajson2 中的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 判断 失去类型安全
正文到此结束
本文目录