May*_*yur 19 java json jackson
我正在尝试一个简单的JSON来反序列化到java对象.不过,我,让空字符串值,java.lang.String
属性值.在其余属性中,空值正在转换为空值(这就是我想要的).
我的JSON和相关的Java类如下所示.
JSON字符串:
{
"eventId" : 1,
"title" : "sample event",
"location" : ""
}
Run Code Online (Sandbox Code Playgroud)
EventBean类POJO:
public class EventBean {
public Long eventId;
public String title;
public String location;
}
Run Code Online (Sandbox Code Playgroud)
我的主要类代码:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
try {
File file = new File(JsonTest.class.getClassLoader().getResource("event.txt").getFile());
JsonNode root = mapper.readTree(file);
// find out the applicationId
EventBean e = mapper.treeToValue(root, EventBean.class);
System.out.println("It is " + e.location);
}
Run Code Online (Sandbox Code Playgroud)
我期待打印"它是空的".相反,我得到"它是".显然,在转换为我的String对象类型时,Jackson不会将空字符串值视为NULL .
我读到了预期的地方.但是,这也是我想要避免的java.lang.String.有一个简单的方法吗?
Sac*_*141 15
杰克逊会为其他对象提供null,但对于String,它将给出空字符串.
但您可以使用自定义JsonDeserializer
来执行此操作:
class CustomDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
JsonNode node = jsonParser.readValueAsTree();
if (node.asText().isEmpty()) {
return null;
}
return node.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
在课堂上,你必须将它用于位置字段:
class EventBean {
public Long eventId;
public String title;
@JsonDeserialize(using = CustomDeserializer.class)
public String location;
}
Run Code Online (Sandbox Code Playgroud)
小智 14
可以为String类型定义自定义反序列化器,覆盖标准String反序列化器:
this.mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(String.class, new StdDeserializer<String>(String.class) {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String result = StringDeserializer.instance.deserialize(p, ctxt);
if (StringUtils.isEmpty(result)) {
return null;
}
return result;
}
});
mapper.registerModule(module);
Run Code Online (Sandbox Code Playgroud)
这样,所有String字段的行为方式都相同.
您可能首先想看看在 Github 问题上是否有任何要求此确切功能的进展。
对于那些使用 Spring Boot 的人:jgesser 的回答对我最有帮助,但我花了一段时间试图找出在 Spring Boot 中配置它的最佳方法。
实际上,文档说:
任何 com.fasterxml.jackson.databind.Module 类型的 bean 都会自动注册到自动配置的 Jackson2ObjectMapperBuilder 并应用于它创建的任何 ObjectMapper 实例。
因此,jgesser 的答案扩展为您可以将其复制粘贴到 Spring Boot 应用程序中的新类中
@Configuration
public class EmptyStringAsNullJacksonConfiguration {
@Bean
SimpleModule emptyStringAsNullModule() {
SimpleModule module = new SimpleModule();
module.addDeserializer(
String.class,
new StdDeserializer<String>(String.class) {
@Override
public String deserialize(JsonParser parser, DeserializationContext context)
throws IOException {
String result = StringDeserializer.instance.deserialize(parser, context);
if (StringUtils.isEmpty(result)) {
return null;
}
return result;
}
});
return module;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17637 次 |
最近记录: |