Java 如何容忍Jackson在json中使用错误的参数类型?

Java 如何容忍Jackson在json中使用错误的参数类型?,java,json,spring,spring-boot,jackson,Java,Json,Spring,Spring Boot,Jackson,我正在与第三方API集成,该API使用如下对象进行响应: { "name": { "firstName": "John", "lastName": "Doe" } } class Name { private String firstName; private String lastName; } 相应的Java类如下所示: { "name": { "firstName": "John", "lastName": "Doe" }

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

{
  "name": {
    "firstName": "John",
    "lastName": "Doe"
  }
}
class Name {
    private String firstName;
    private String lastName;
}
相应的Java类如下所示:

{
  "name": {
    "firstName": "John",
    "lastName": "Doe"
  }
}
class Name {
    private String firstName;
    private String lastName;
}
问题:当名称应为
null
时,API返回空字符串,而不是
null
或空对象:

{
  "name": ""
}
问题:如何在客户端容忍这种行为,请记住我使用Spring的
RestTemplate
Jackson
调用API

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


注意:不可能使API正常工作。我必须自己处理。

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

试一试

名称;
试一试{
//您的restTemplate代码在无法序列化时将引发异常
}捕获(执行选项e){
name=null;
}
反序列化程序文档:

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

//在类上指定反序列化程序
@JsonDeserialize(使用=yournameClasseDeserializer.class)
公共类yourname类{
//你们班在这里吗
}
//您的反序列化程序类
公共类YourNameClassDeserializer扩展了StdDeserializer{
@凌驾
公共项反序列化(JsonParser jp,反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
JsonNode节点=jp.getCodec().readTree(jp);
//使用JsonNode了解您将获得什么,并自己创建对象
返回新的YourNameClass(firstName,lastName);
}
}

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

Jackson为此提供了反序列化功能。使用Spring boot,您可以通过在
应用程序中启用以下属性来启用此功能。属性

spring.jackson.deserialization.accept-empty-string-as-null-object=true
之后,Jackson将空字符串反序列化为
null


请注意,由于这是一个全局反序列化功能,因此当名字为空字符串时也会发生这种情况。

试试这个。这应该行得通。我想说您需要稍微更改一下java模型

@JsonDeserialize(using = NameDeserializer.class)
public class NameWrapper {
    private Name name;

    public NameWrapper() {
    }

    public NameWrapper(Name name) {
        this.name = name;
    }

    public Name getName() {
        return name;
    }

    public void setName(Name name) {
        this.name = name;
    }
}
名称类将是这样的

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

    public Name() {
    }

    public Name(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
最后是反序列化程序

public class NameDeserializer extends JsonDeserializer {
    @Override
    public NameWrapper deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException 
{

这将适用于这两个json

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


请提供更多信息。当您收到
“name”:
?有几种方法可以解决这个问题。你可能误解了这个问题。Name是一个类。问题是API有时返回一个复合对象,有时,当它应该返回null时,返回一个字符串。@SashaShpota你是对的,我的想法混合了firstName/lastName/Name字段。无论如何,我编辑了我的答案以显示alt通过使用
ACCEPT\u EMPTY\u STRINGS\u AS\u NULL\u OBJECTS
反序列化功能,实现了一种交互式方式。