Как диспетчер Джексона знает, какое поле в каждом объекте 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; }
}

Мой вопрос в том, как (используя простейшее объяснение), отображает ли объект "десериализует" объект Json? Я думал, что это совпадающие имена переменных, но изменение их на несколько букв не повлияло на вывод. Затем я попытался переключить порядок функций set(), но ничего не сделал. Я также пробовал оба, но это тоже бесполезно. Я предполагаю, что здесь есть что-то более сложное, но что?

Я попытался посмотреть в документации и прошлом коде, но я не видел объяснений, которые имели смысл для меня.

Ответ 1

Без аннотаций:

Без каких-либо аннотаций он выполняет так называемое отображение POJO, он просто использует отражение для членов экземпляра и использует некоторые правила о том, как сопоставить ключи в json к именам членов экземпляра. * note: он работает с членами private, а также public или package protected, а также

Если он не совпадает с именами членов экземпляра, он начинает пытаться сопоставить методы getXXX и setXXX, если он не соответствует чему-либо, а затем отказывается.

С аннотациями:

Он использует метаданные, предоставленные аннотациями, для преобразования и преобразования.

Всегда лучше использовать аннотации, когда у вас есть источник, чтобы добавить их в, тогда нет никакой угадывающей работы над тем, что сопоставляется с чем.

Помните, что явное всегда лучше, чем неявное!

Все это хорошо документировано в WIKI:

Отображение и Annotations

Схема JSON:

Я создаю определения схемы JSON для всех моих новых проектов, чтобы документировать то, что является и недействительно JSON в соответствии с механизмом правил схемы. Это отличный способ документировать ваши структуры данных и устранять ошибки синтаксического анализа.