Java 是否要将null转换为空字符串?
我正在使用Jersey 1.18,并且启用了POJOMappingFeature。 我希望所有传入和传出的JSON值都从Java 是否要将null转换为空字符串?,java,json,jersey,Java,Json,Jersey,我正在使用Jersey 1.18,并且启用了POJOMappingFeature。 我希望所有传入和传出的JSON值都从null转换为空字符串 如何配置映射? 我在网上搜索过,但找不到我要找的东西 从my web.xml: <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.ser
null
转换为空字符串
如何配置映射?
我在网上搜索过,但找不到我要找的东西
从my web.xml:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.abc.restControllers</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
如果正在使用,则可以为POJO编写自定义序列化程序。例如:
public class FooSerializer extends JsonSerializer<Foo> {
@Override
public void serialize(final Foo value, final JsonGenerator jgen,
final SerializerProvider provider) throws IOException
{
if (value.bar() == null) {
jgen.writeString("");
} else {
jgen.writeString(value.bar());
}
}
}
您还可以通过扩展JsonDeserializer
来创建自定义反序列化程序,以处理传入的空值,或者放置一个过滤器来解析正文?如果您正在使用,您可以为POJO编写自定义序列化程序。例如:
public class FooSerializer extends JsonSerializer<Foo> {
@Override
public void serialize(final Foo value, final JsonGenerator jgen,
final SerializerProvider provider) throws IOException
{
if (value.bar() == null) {
jgen.writeString("");
} else {
jgen.writeString(value.bar());
}
}
}
您还可以通过扩展
JsonDeserializer
来创建自定义反序列化程序,以处理传入的空值,或者放置一个过滤器来解析正文?如果您正在使用Jackson并访问了ObjectMapper
,则可以按照您想要的方式对其进行配置
您可以设置一个空值序列化程序,为空对象写入空字符串,并注册一个字符串反序列化程序,将JSON中的空字符串视为空字符串
以下是一个例子:
public class JacksonNull {
public static class Bean {
public String field1;
public String field2;
public Bean() {}
public Bean(String field1, String field2) {
this.field1 = field1;
this.field2 = field2;
}
@Override
public String toString() {
return "Bean{" +
"field1='" + field1 + '\'' +
", field2='" + field2 + '\'' +
'}';
}
}
public static void main(String[] args) throws IOException {
Bean bean = new Bean(null, "value");
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object value,
JsonGenerator jgen,
SerializerProvider provider) throws IOException {
jgen.writeString("");
}
});
SimpleModule module = new SimpleModule();
module.addDeserializer(String.class, new JsonDeserializer<String>() {
@Override
public String deserialize(JsonParser jp,
DeserializationContext ctxt) throws IOException {
String string = jp.getValueAsString();
return string.isEmpty() ? null : string;
}
});
mapper.registerModule(module);
String json = mapper.writeValueAsString(bean);
System.out.println(json);
System.out.println(mapper.readValue(json, Bean.class));
}
}
如果您正在使用Jackson,并且已经访问了
ObjectMapper
,您可以按照自己的方式对其进行配置
您可以设置一个空值序列化程序,为空对象写入空字符串,并注册一个字符串反序列化程序,将JSON中的空字符串视为空字符串
以下是一个例子:
public class JacksonNull {
public static class Bean {
public String field1;
public String field2;
public Bean() {}
public Bean(String field1, String field2) {
this.field1 = field1;
this.field2 = field2;
}
@Override
public String toString() {
return "Bean{" +
"field1='" + field1 + '\'' +
", field2='" + field2 + '\'' +
'}';
}
}
public static void main(String[] args) throws IOException {
Bean bean = new Bean(null, "value");
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object value,
JsonGenerator jgen,
SerializerProvider provider) throws IOException {
jgen.writeString("");
}
});
SimpleModule module = new SimpleModule();
module.addDeserializer(String.class, new JsonDeserializer<String>() {
@Override
public String deserialize(JsonParser jp,
DeserializationContext ctxt) throws IOException {
String string = jp.getValueAsString();
return string.isEmpty() ? null : string;
}
});
mapper.registerModule(module);
String json = mapper.writeValueAsString(bean);
System.out.println(json);
System.out.println(mapper.readValue(json, Bean.class));
}
}
从泽西岛邮件列表:
还有一件事:要忽略空值,您可能还需要
需要提供您自己的Jackson ObjectMapper提供程序
使用Jackson SerializationConfig.Feature WRITE_NULL_属性[3]
设置为false。请参阅[2]了解有关如何钩住自定义链接的详细信息
ObjectMapper进入泽西岛
嗯,
~z~雅库布
[2]
[3]
我想这就是你的答案。来自泽西岛邮件列表:
还有一件事:要忽略空值,您可能还需要
需要提供您自己的Jackson ObjectMapper提供程序
使用Jackson SerializationConfig.Feature WRITE_NULL_属性[3]
设置为false。请参阅[2]了解有关如何钩住自定义链接的详细信息
ObjectMapper进入泽西岛
嗯,
~z~雅库布
[2]
[3]
我想这就是你的答案。你是否使用Jackson作为JSON处理器?能否检查项目类路径中是否存在jackson库依赖项?如果是这样的话,这很容易实现。你是否使用Jackson作为JSON处理器?能否检查项目类路径中是否存在jackson库依赖项?如果是这样的话,很容易做到。这个答案是“最”正确的。而且是最干净的(也就是说,如果这是评分,你的教授会给它一个a)。这个答案是“最”正确的。而且是最干净的(也就是说,如果这是分级的,你的教授会给它一个a)。WRITE_NULL_属性看起来像是一种不推荐使用的配置序列化以跳过写入NULL值的方法。我认为问题在于如何将空值转换为空字符串。是的,不推荐使用,但仍然有效。另外,请重新阅读我的文章,设置此属性只需完成一半的工作。WRITE_NULL_属性似乎是一种不推荐使用的配置序列化以跳过写入NULL值的方法。我认为问题在于如何将空值转换为空字符串。是的,不推荐使用,但仍然有效。再次阅读我的文章,设置这个属性只是工作的一半。
{"field1":"","field2":"value"}
Bean{field1='null', field2='value'}