java - Jackson 如何容忍 json 中错误的参数类型?

标签 java json spring spring-boot jackson

我正在与第三方 API 集成,该 API 使用如下对象进行响应:

{
  "name": {
    "firstName": "John",
    "lastName": "Doe"
  }
}

对应的Java类如下所示:

class Name {
    private String firstName;
    private String lastName;
}

问题:当名称应为 null 时,API 返回空字符串,而不是 null 或空对象:

{
  "name": ""
}

疑问:如何在客户端容忍这种行为,同时记住我使用 Spring 的 RestTemplateJackson 调用 API?

换句话说,我如何告诉 Jackson 将传入 name 属性的空字符串视为 null,或者视为具有 null 属性的类 Name 的对象?

注意:API 无法正常工作。我必须亲自处理。

最佳答案

您可以使用try/catch并处理错误。或者,如果您必须处理不同的场景,您可以编写自己的反序列化器。

尝试捕捉

Name name;
try {
    // Your restTemplate code, will throw Exception when cannot serialize
} catch (Execption e) {
    name = null;
}

解串器文档: https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind/JsonDeserializer.html

如何反序列化的示例(未测试)

// On your class specify Deserialzer
@JsonDeserialize(using = YourNameClassDeserializer.class)
public class YourNameClass {
    // your class here
}

// Your Deserializer class
public class YourNameClassDeserializer extends StdDeserializer<Item> { 

    @Override
    public Item deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        // Use JsonNode to figure out what you are getting and create the object by yourself
        return new YourNameClass(firstName, lastName);
    }
}

您可以选择其中一种解决方案,两者都适合您的情况。

关于java - Jackson 如何容忍 json 中错误的参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129520/

相关文章:

java - QueryDSL:从谓词( boolean 表达式)对象中提取表名称

javascript - 如何将 JSON 字符串转换为 javascript 中的函数?

JavaScript 动态过滤器

mysql - 嵌套对象插入需要时间 -Spring Data JPA、Hibernate 和 MySQL

java - JPA/hibernate 大集合

spring - Elasticsearch API与Spring数据与Logstash

java - Oracle 的 HikariConfig 池

java - 分割二维数组(JAVA)

javascript - 基于条件的数组操作JS

java - Commons 将上传的文件内容转换为字符串值