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

假设我有一个像这样的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()函数的顺序,但是没有做任何事情。 我也试过了,但这也没用。 我猜这里的工作比较复杂,但是什么呢?

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

没有注释:

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

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

带注释:

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

当你有源添加注释时显式使用注释总是更好,然后没有猜测工作映射到什么。

记住显式总是优于隐式!

这在WIKI上都有很好的记录:

映射和注释

JSON架构:

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