Java 如何容忍Jackson在json中使用错误的参数类型?
我正在与第三方API集成,该API使用如下对象进行响应: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" }
{
"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
反序列化功能,实现了一种交互式方式。