【Jackson】@JsonAnyGetter 和 @JsonAnySetter

本文介绍如何利用@JsonAnySetter和@JsonAnyGetter注解处理JSON序列化和反序列化过程中的未知属性,通过将未识别的属性存储在Map中,并在需要时平铺输出,实现对动态字段的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@JsonAnySetter

可以将序列化时未识别到的属性都扔进一个map里。

@JsonAnyGetter

将map里的属性都平铺输出。

model类:

public class JsonModel1 {

    private long id;
    private String name;
    private Map<String, Object> map;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @JsonAnySetter
    public void addExtra(String key, Object value) {
        if (map == null) {
            map = new HashMap<>();
        }
        map.put(key, value);
    }

    @JsonAnyGetter
    public Map<String, Object> getMap() {
        return map;
    }

test:

    @Test
    public void testDS1() throws IOException {
        String json1 = "{\"name\":\"ly\",\"id\":1,\"address\":\"yuanping\"}";
        JsonModel1 m2 = mapper.readValue(json1, JsonModel1.class);
        System.out.println(m2.getMap());

        String json = mapper.writeValueAsString(m2);
        System.out.println(json);
    }

输出:
{address=yuanping}
{"id":1,"name":"ly","address":"yuanping"}

可以看到,反序列化时未识别到的属性address被塞进了map属性了,另外在反序列时,也可以输出到model类其他属性的平级位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值