Десериализовать org.springframework.data.util.pair из json - PullRequest
0 голосов
/ 29 октября 2018

Я должен иметь возможность сериализовать / десериализовать org.springframework.data.util.pair в JSON / из JSON.

У меня есть List<Pair<A, B>> myPairList - этот список мне нравится хранить / загружать.

Сериализация не проблема; однако, поскольку pair является неизменным, конструктор по умолчанию отсутствует, а десериализация завершается неудачей.
Я знаю, что есть @JsonCreator; но если я не ошибаюсь, мы можем разместить его только на конструкторе. Поскольку класс pair является окончательным, я не могу расширить его собственным конструктором по умолчанию, аннотированным @JsonCreator.
Кто-нибудь может указать мне, как я могу достичь своей цели в любом случае? Я хотел бы избежать создания собственного класса-оболочки.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Ответ Markusw является правильным. Чтобы показать реальный пример, вот как я решил окончательно десериализовать список пар:

public class MyPairDeserializer extends JsonDeserializer<Pair<MyClassA, MyClassB>> {

  static private ObjectMapper objectMapper = null;

  @Override
  public Pair<MyClassA, MyClassB> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    if (objectMapper == null) {
      objectMapper = new ObjectMapper();
      objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }
    JsonNode treeNode = jsonParser.getCodec().readTree(jsonParser);
    MyClassA first = objectMapper.treeToValue(treeNode.get("first"), MyClassA.class);
    MyClassB second = objectMapper.treeToValue(treeNode.get("second"), MyClassB.class);
    return Pair.of(first, second);
  }

}

...
SimpleModule module = new SimpleModule();
module.addDeserializer(Pair.class, new MyPairDeserializer());
objectMapper.registerModule(module);
List<Pair<MyClassA, MyClassB>> myData = objectMapper.readValue(file..., new TypeReference<List<Pair<Class<MyClassA>, Class<MyClassB>>>>() {
...

Обратите внимание на встроенный ObjectMapper в десериализаторе. Он используется для десериализации «первого» и «второго» пары.

0 голосов
/ 29 октября 2018

Я думаю, вам нужно реализовать собственный десериализатор для этого атрибута, как в этом ответе https://stackoverflow.com/a/19167145/1905015. Вы можете поместить аннотацию @JsonDeserialize над атрибутом.

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