Jackson 映射器如何知道每个 Json 对象中的哪个字段要分配给类对象?

2022-09-02 03:19:48

假设我有一个像这样的Json对象:

{
    "name": "Bob Dole",
    "company": "Bob Dole Industries",
    "phone": {
        "work": "123-456-7890",
        "home": "234-567-8901",
        "mobile": "345-678-9012"
    }
}

为了帮助我阅读它,我将Jackson的对象映射器与以下类一起使用:

public class Contact {
        public static class Phone {
        private String work;
        private String home;
        private String mobile;

        public String getWork() { return work; }
        public String getHome() { return home; }
        public String getMobile() { return mobile; }

        public void setWork(String s) { work = s; }
        public void setHome(String s) { home = s; }
        public void setMobile(String s) { mobile = s; }
    }

    private String name;
    private String company;
    private Phone phone;

    public String getName() { return name; }
    public String getCompany() { return company; }
    public Phone getPhone() { return phone; }

    public void setName(String s) { name = s; }
    public void setCompany(String s) { company = s; }
    public void setPhone(Phone p) { phone = p; }
}

我的问题是,对象映射器如何(使用最简单的解释)如何“反序列化”Json对象?我认为它与变量名称匹配,但将它们更改几个字母不会影响输出。然后,我尝试切换 set() 函数的顺序,但这没有做任何事情。我也尝试了两者,但那也没用。我猜这里有更复杂的东西在工作,但那又如何呢?

我试图查看文档和过去的代码,但我没有看到对我有意义的解释。


答案 1

不带注释:

在没有任何注释的情况下,它执行所谓的映射,它只使用实例成员上的反射,并使用一些有关如何将json中的键映射到实例成员名称的规则。*注意:它适用于私人会员以及公共受保护的软件包POJO

如果它与实例成员的名称不匹配,则开始尝试匹配 and 方法,如果它与任何内容都不匹配,则放弃。getXXXsetXXX

带注释:

它使用批注提供的元数据来执行映射和转换。

当您有要添加注释的源时,最好显式使用注释,这样就无需猜测将什么映射到什么。

请记住,显式总是比隐式更好!

这在WIKI上有很好的记录:

映射注释

JSON 架构:

我现在正在为所有新项目创建 JSON 架构定义,以根据架构规则引擎记录哪些是有效的 JSON,哪些是无效的 JSON。这是记录数据结构并消除解析错误的好方法。


答案 2