java - 如何容忍杰克逊的 json 中错误的参数类型?
问题描述
我正在与第三方 API 集成,该 API 响应如下对象:
{
"name": {
"firstName": "John",
"lastName": "Doe"
}
}
对应的 Java 类如下所示:
class Name {
private String firstName;
private String lastName;
}
问题:当名称应该是null
API 返回一个空字符串而不是null
一个空对象时:
{
"name": ""
}
问题:如何在客户端容忍这种行为,记住我使用 SpringRestTemplate
和调用 API Jackson
?
换句话说,我如何告诉 Jackson 将传递给name
属性的空字符串视为 null,或视为Name
具有 null 属性的类的对象?
注意:无法使 API 正常工作。我必须在我身边处理它。
解决方案
您要么使用try / catch
并处理错误。或者,如果您必须处理不同的场景,您可以编写自己的反序列化器。
试着抓
Name name;
try {
// Your restTemplate code, will throw Exception when cannot serialize
} catch (Execption e) {
name = null;
}
关于如何反序列化的示例(未测试)
// 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);
}
}
您可以选择其中一种解决方案,两者都适用于您的情况。
推荐阅读
- sql - 从两个表中选择常用项
- javascript - ChromeCast 发件人应用程序:在 Chrome 移动设备上 requestSessionById 不起作用
- java - 当我在外部tomcat中重新部署war文件时,本机库mssql-jdbc_auth-8.4.1.x64.dll已经加载到另一个类加载器中
- xml - 如何在 XSLT 管道的下一阶段删除空元素
- linux - 错误:控制显示未定义;请运行 `nvidia-settings --help` 以获取使用信息
- java - 如何将多行字符串值转换为单行(已解决)
- vue.js - 如何操作和更改强制 v-radio-group 中的默认选中按钮
- javascript - 用正则表达式将空格缩进替换为制表符
- c++ - C++ 中的 Sendto 函数在发送到非本地主机地址时返回无效参数
- javascript - 在整个页面中查找类并删除另一个 div