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

时间:2014-03-04 04:25:34

标签: java json jackson

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

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

为了帮助我阅读,我使用Jackson的Object Mapper和以下课程:

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; }
}

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

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

1 个答案:

答案 0 :(得分:32)

没有注释:

没有任何注释,它执行所谓的POJO映射,它只在实例成员上使用reflection并使用一些规则来解决如何将json中的键映射到实例的名称成员。 * 注意:它适用于private成员以及publicpackage protected以及

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

带注释:

它使用注释提供的元数据进行映射和转换。

当您有源添加注释时,明确使用注释总是更好,然后对于映射到什么的内容没有猜测。

记住显式总是优于隐式!

这在WIKI上有很好的记录:

MappingAnnotations

JSON架构:

我正在为我的所有新项目创建JSON模式定义,以根据模式规则引擎记录什么是有效的JSON。这是记录数据结构和消除解析错误的好方法。