Джексон com.faster xml .jackson.databind.ex c .MismatchedInputException с пустой строкой - PullRequest
1 голос
/ 25 марта 2020

Имея следующий json фрагмент:

"Location": {
    "Address": ""
},

И мой Pojo

public class Address implements Serializable
{

    @JsonProperty("City")
    private String city;
    @JsonProperty("StateProvinceCode")
    private String stateProvinceCode;
    @JsonProperty("PostalCode")
    private String postalCode;
    @JsonProperty("CountryCode")
    private String countryCode;
    private final static long serialVersionUID = -4475717488164417476L;

    /**
     * No args constructor for use in serialization
     * 
     */
    public Address() {
    }

    /**
     * 
     * @param city
     * @param countryCode
     * @param postalCode
     * @param stateProvinceCode
     */
    public Address(String city, String stateProvinceCode, String postalCode, String countryCode) {
        super();
        this.city = city;
        this.stateProvinceCode = stateProvinceCode;
        this.postalCode = postalCode;
        this.countryCode = countryCode;
    }

getters and settes ...

Я получил com.faster xml .jackson.databind.ex c .MismatchedInputException : Невозможно создать экземпляр com.xxx.Address (хотя существует хотя бы один создатель): нет конструктора аргумента строки / фабричного метода для десериализации из значения строки ('') \ n в [Source: UNKNOWN; строка: -1, столбец: -1]

Что кажется довольно очевидным, пустая строка не может быть десериализована как адрес. Проблема здесь в том, что иногда ответ приходит в виде пустой строки, а другие - в виде полного адреса Obje c.

Как я могу настроить Jackson objectMapper, чтобы он велел игнорировать наличие пустой строки ??

Этот ответ поступил из внешнего источника, поэтому я не могу изменить этот ответ.

Вот моя конфигурация Object Mapper

@Bean
  public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new Jdk8Module());
    mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    return mapper;
  }

Дополнительное примечание: классы Pojo генерируются с использованием подключаемого модуля jsonschema2pojo и основаны на json схемах

1 Ответ

1 голос
/ 25 марта 2020

Как подсказывает @Dmitry Zagorulkin, включите DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT в true. Для получения более подробной информации, проверьте документы .

Вот код, который я пытался повторить проблему и исправил, добавив строку, выделенную комментарием.

public class JacksonExample2 {

    private static String json1 = "{\r\n" + 
         "  \"Location\": {\r\n" + 
         "    \"Address\": \"\"\r\n" + 
         "  }\r\n" + 
         "}";


    public static void main(String[] args) throws JSONException, IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());
        mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
        // Add this line
        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        ParentData parentData = mapper.readValue(json1, ParentData.class);
        Address address = new Address("New York", null, null, null);
        LocationData locationData = new LocationData(address);
        System.out.println(parentData);
    }

}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
class ParentData {
    @JsonProperty("Location")
    private LocationData locationData;
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
class LocationData {
    @JsonProperty("Address")
    private Address address;
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
class Address implements Serializable {

    @JsonProperty("City")
    private String city;
    @JsonProperty("StateProvinceCode")
    private String stateProvinceCode;
    @JsonProperty("PostalCode")
    private String postalCode;
    @JsonProperty("CountryCode")
    private String countryCode;
    private final static long serialVersionUID = -4475717488164417476L;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...