首页 > 解决方案 > 如何容忍杰克逊的 json 中错误的参数类型?

问题描述

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

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

对应的 Java 类如下所示:

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

问题:当名称应该是nullAPI 返回一个空字符串而不是null一个空对象时:

{
  "name": ""
}

问题:如何在客户端容忍这种行为,记住我使用 SpringRestTemplate和调用 API Jackson

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

注意:无法使 API 正常工作。我必须在我身边处理它。

标签: javajsonspringspring-bootjackson

解决方案


您要么使用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);
    }
}

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


推荐阅读