Значение по умолчанию в поле POJO в случае несоответствия типов данных при десериализации JSON - PullRequest
0 голосов
/ 16 ноября 2018

Когда мы десериализовываем JSON в POJO, JACKSON генерирует исключительную ситуацию несоответствия входных данных в случае несоответствия типов данных, которое ожидается. Поэтому мой вопрос: «Есть ли в Джексоне или Гсоне флаг какой-либо функции для установки значения по умолчанию для несовпадающего поля во время десериализации?»

Я понимаю, что мы можем реализовать пользовательский десериализатор для таких полей, где можно ожидать случайное входное значение. Но поддерживается ли это уже с использованием какого-либо флага в любой Java-библиотеке десериализации сериализации?

Пример кода:

import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.Data;

import java.io.IOException;

public class JsonSample {
@Data
static class Address {
    String houseAddress;
}

@Data
static class InnerJsonClass {
    Integer integerField;
    Address address;
}

public static void main(String[] args) {
    String jsonInput = "{\"integerField\": 1,\"address\":\"hello\"}";
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        InnerJsonClass object = objectMapper.readValue(jsonInput, InnerJsonClass.class);
        System.out.println(object.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }
}}

Исключение:

com. ('Привет') at [Source: (String) "{" integerField ": 1," address ":" hello "}"; строка: 1, столбец: 30] (через цепочку ссылок: com.paytm.logistics.JsonSample $ InnerJsonClass ["address"]) в com.fasterxml.jackson.databind.exc.MismatchedInputException.from (MismatchedInputException.java:63) в com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch (DeserializationContext.java:1342) в com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator (DeserializationContext.java:1031) в com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks (ValueInstantiator.java:371) в com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString (StdValueInstantiator.java:323) в com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString (BeanDeserializerBase.java:1366) в com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther (BeanDeserializer.java:171) в com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize (BeanDeserializer.java:161) в com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet (MethodProperty.java:127) в com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize (BeanDeserializer.java:288) в com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize (BeanDeserializer.java:151) в com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose (ObjectMapper.java:4001) в com.fasterxml.jackson.databind.ObjectMapper.readValue (ObjectMapper.java:2992) в com.paytm.logistics.JsonSample.main (JsonSample.java:25)

Ответы [ 2 ]

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

Ваш jsoninput не в правильном формате, он должен быть таким, как показано ниже: objectMapper преобразует значение в указанном объекте только тогда, когда сопоставления объявлений json и pojo совпадают.

 String jsonInput = "{\"integerField\": 1,\"address\":{\"houseAddress\": \"hello\"}}";

или если вы не хотите изменять строку json, вам нужно использовать код, подобный приведенному ниже

 @Data
    static class InnerJsonClass {
        Integer integerField;
        String address;
    }
0 голосов
/ 16 ноября 2018

Адрес - это объект, а не строка.

String jsonInput = "{\"integerField\": 1,\"address\":{\"houseAddress\": \"hello\"}}";

Попробуйте это

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