Джексон JsonProperty - PullRequest
       0

Джексон JsonProperty

0 голосов
/ 10 марта 2020

Я пытаюсь проанализировать json файл, используя jackson @JsonProperty. У меня есть интересная проблема под рукой. Одно из имен полей, помеченных как @JsonProperty, может отличаться в зависимости от источника ввода. Пример json файлов ниже

car1.json --> {"car": {"color": "yellow","type": "luxurySedan"}}
car2.json --> {"car": {"color": "yellow","modeltype": "SUV"}}

Мой Datamodel похож на

@Data
class Car {

   @JsonProperty("color")
   private String color; 

   @JsonProperty("type")
   private String type; // Don't want to use alias to solve above problem

 }

Второй файл car2. json не анализируется. Я попытался проследить тип поля, чтобы получить значение из файла свойств (с помощью весенней загрузки), но он не работает должным образом. Я не хочу использовать alias исключительно потому, что мне придется изменить код, если имя поля изменится для любого файла. Может кто-нибудь помочь, пожалуйста

@JsonProperty(@Value("${car.type}")) // Compilation error (It's a spring boot project)
@JsonProperty("${car.type}") // Values not read

1 Ответ

0 голосов
/ 10 марта 2020

Ваш JSON не имеет узла car, поэтому вы не можете использовать его как часть вашей @JsonProperty аннотации. Вообще говоря, вам нужно только указать отдельные имена узлов, а не полные пути, так как они оцениваются относительно узла root. Там, где у вас есть вложенные структуры JSON, принято заключать их в отдельный класс, поэтому вам не нужно указывать полные пути.

class Car {

    @JsonProperty("color")
    private String color;

    @JsonProperty("type")
    private String type;

    @JsonProperty("modeltype")
    private String modelType;

    // The rest of the class
}

Следует выполнить трюк для JSON, который вы предоставили. Если свойство отсутствует в источнике JSON, тогда его значение будет просто null в вашем Java объекте.

Ваш второй образец JSON завершится неудачно, потому что объект Java, которым Джексон является попытка разархивировать JSON в не объявляет свойство с именем "modeltype", а поведение по умолчанию - сбой для неизвестных свойств. Это конкретное поведение можно подавить, добавив следующую аннотацию на уровне класса:

@JsonIgnoreProperties(ignoreUnknown = true)

Однако это заставит Джексона полностью игнорировать любое свойство, для которого нет сопоставленного поля, поэтому вы потеряете все данные, связанные с неизвестные свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...