Джексон десериализует JSON с дополнительными свойствами, используя @JsonRootName - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу десериализовать объект, который помечен @JsonRootName.Однако JSON, в котором переносится объект, содержит еще одно дополнительное свойство.В результате Джексон жалуется на:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (FIELD_NAME), expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name 'account'), but FIELD_NAME at [Source: (ByteArrayInputStream); line: 1, column: 26].

Очевидно, десериализация @JsonRootName аннотированных объектов работает ТОЛЬКО, если этот объект является единственным свойством в файле JSON - поскольку он не ожидает, что "lastTransactionID" будет там.

Вот мой Accountкласс:

@JsonRootName("account")
public class Account {
    private String id;
}

Это JSON, который мне нужно десериализовать:

{
  "account": {
    "id": "1234"
  },
  "lastTransactionID": "1"
}

Поскольку я использую пружину, у меня также есть эта настройка spring.jackson.deserialization.unwrap_root_value=true.

Есть ли способ решить эту проблему без:

  • написания собственного десериализатора?

ИЛИ

  • , перехватывающего ответ и удаляющего егодополнительной собственности перед десериализацией?

1 Ответ

0 голосов
/ 03 февраля 2019

Похоже, что самым простым способом решения этой проблемы является создание оболочки для класса Account и десериализация json как обычно с отключенной функцией DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES.

public static class Wrapper {
    public Account account;
}

В этом случае другие поля будут игнорироваться.

Это не очень хорошее решение, я знаю, но оно решает проблему.

...