【问题标题】:How does the Jackson mapper know what field in each Json object to assign to a class object?Jackson 映射器如何知道每个 Json 对象中的哪个字段分配给类对象?
【发布时间】:2014-03-04 04:25:33
【问题描述】:

假设我有一个这样的 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; }
}

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

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

【问题讨论】:

  • 您是否也尝试过通过几个字母来更改 getter 和 setter?
  • 我将 setEmail(String s) 更改为 setmmail(String s) 但电子邮件字段的结果是相同的。我无法更改吸气剂,因为那会破坏我的程序。这是控制它的东西吗?

标签: java json jackson


【解决方案1】:

没有注释:

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

如果与实例成员的名称不匹配,则开始尝试匹配getXXXsetXXX 方法,如果不匹配则放弃。

带注释:

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

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

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

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

MappingAnnotations

JSON 架构:

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

【讨论】:

  • 我有点理解...所以它查看类中的变量并尝试猜测它与 Json 对象中的哪个字段相关?我正在阅读文档,我看到它是如何从前者到后者的,但我仍然不明白它是如何发生的。
  • 好吧,我明白了。但是假设 ObjectMapper 遇到了类似"name": "Bob Dole" 的东西。它怎么知道打电话给setName(String s) 而不是setCompany(String s)setPhone(Phone p)?我是否误解了 Json 对象到底是什么?
  • 链接似乎死了。
  • 您到 wiki 文档的两个链接都已失效。 github.com/FasterXML/jackson-docs
猜你喜欢
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多