我正在尝试使用简单的JSON来反序列化到java对象。但是,我为java.lang.String
属性值获取空 String 值。在其他属性中,空值正在转换为 null 值(这就是我想要的)。
我的JSON和相关的Java类列在下面。
JSON字符串:
{
"eventId" : 1,
"title" : "sample event",
"location" : ""
}
EventBean 类POJO:
public class EventBean {
public Long eventId;
public String title;
public String location;
}
我的主要课程代码:
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);
}
我期待打印"它是空的"。相反,我正在"它是"。显然, Jackson 在转换为我的 String 对象类型时,并未将空字符串值视为NULL。
我在某处读到了它的预期。但是,对于 java.lang.String ,我也想避免这种情况。有一个简单的方法吗?
答案 0 :(得分:12)
可以为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);
这样所有String字段的行为方式都相同。
答案 1 :(得分:11)
Jackson会为其他对象提供null,但对于String,它将提供空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();
}
}
在课堂上,你必须将它用于位置字段:
class EventBean {
public Long eventId;
public String title;
@JsonDeserialize(using = CustomDeserializer.class)
public String location;
}
答案 2 :(得分:2)
我可以通过以下配置来实现。
moment(dt).subtract(2, 'hours').format();
答案 3 :(得分:0)
您可能首先想看看the Github issue在请求此确切功能方面是否有任何进展。
对于使用Spring Boot的用户:jgesser的回答对我来说最有用,但是我花了一些时间试图找出在Spring Boot中配置它的最佳方法。
实际上,the documentation说:
任何类型为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;
}
}
答案 4 :(得分:0)
一种简单的解决方法是在反序列化json字符串之前用空值替换“”。
.replace(“ \” \“”,“ null”)
这样,所有空白字符串都将反序列化为null
答案 5 :(得分:0)
可以使用JsonCreator注释。对我有用
#banner {
transform: scale(1, 1);
transition: all 300ms;
}
#banner:hover {
transform: scale(1.01, 1.01);
}