gpt4 book ai didi

java - java jackson反序列化器如何处理同一字段上的 boolean 值和对象

转载 作者:行者123 更新时间:2023-11-30 07:54:51 24 4
gpt4 key购买 nike

我正在使用第 3 方 JSON API,它返回如下数据:

{详细信息:{...},...}

我使用 Java Jackson 将这个 JSON 字符串反序列化为一个 POJO 对象,字段声明为:

@JsonProperty("细节")
公共(public)详细信息 getDetails(){...}

Details是另外一个类。

一切都很好,直到我发现 API 可能返回如下数据:

{详细信息:错误,...}

如果 details 为空,则返回 false!!! jackson 给了我这个异常(exception):

com.fasterxml.jackson.databind.JsonMappingException:无法从 boolean 值实例化类型 [简单类型,类详细信息] 的值;没有单 boolean/boolean 参数构造函数/工厂方法(通过引用链:...["details"])

那么,如何处理这种JSON字符串呢?如果为空,我只需要将此字段设置为 null。

最佳答案

来自 Jackson 的错误消息暗示库已经内置了对静态工厂方法的支持。这是(也许)比自定义反序列化器更简单的解决方案:

我创建了这个示例 POJO,它带有一个静态工厂方法,并进行了注释以便 Jackson 使用它:

public class Details {
public String name; // example property

@JsonCreator
public static Details factory(Map<String,Object> props) {

if (props.get("details") instanceof Boolean) return null;

Details details = new Details();
Map<String,Object> detailsProps = (Map<String,Object>)props.get("details");
details.name = (String)detailsProps.get("name");
return details;
}
}

测试方法:

public static void main(String[] args)
{
String fullDetailsJson = "{\"details\": {\"name\":\"My Details\"}} ";
String emptyDetailsJson = "{\"details\": false} ";
ObjectMapper mapper = new ObjectMapper();
try {
Details details = mapper.readValue(fullDetailsJson, Details.class);
System.out.println(details.name);
details = mapper.readValue(emptyDetailsJson, Details.class);
System.out.println(details);
} catch (Exception e) {
e.printStackTrace();
}
}

结果符合预期:

My Details
null

关于java - java jackson反序列化器如何处理同一字段上的 boolean 值和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43603059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com