Как диспетчер Джексона знает, какое поле в каждом объекте 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 в соответствии с механизмом правил схемы. Это отличный способ документировать ваши структуры данных и устранять ошибки синтаксического анализа.