Jersey POJOMappingFeature将null转换为空字符串?

我正在使用Jersey 1.18并启用了POJOMappingFeature。 我希望所有传入和传出的JSON值都从null转换为空字符串。

如何配置映射? 我搜索过网页但无法找到我要找的内容。

从我的web.xml:

  Jersey REST Service com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages com.abc.restControllers   com.sun.jersey.api.json.POJOMappingFeature true  1  

以及控制器的一个例子:

 package com.abc.restControllers; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.abc.restModals.Place.Place_descInfo_Request; import com.abc.restModals.Place.Place_descInfo_Response; @Path("/place") public class PlaceController { @POST @Path("/place_descInfo") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Place_descInfo_Response place_descInfo(Place_descInfo_Request req) { return new Place_descInfo_Response(req); } } // End class 

如果您使用的是Jackson ,您可以为您的pojos编写自定义序列化程序。 例如:

 public class FooSerializer extends JsonSerializer { @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()); } } } 

然后,在你的Foo对象上:

 @JsonSerialize(using = FooSerializer.class) public class Foo { private String bar; public String bar() { return bar; } } 

您还可以通过扩展JsonDeserializer来处理传入的空值,或者使用filter来解析主体来创建自定义反序列化器?

如果您正在使用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() { @Override public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeString(""); } }); SimpleModule module = new SimpleModule(); module.addDeserializer(String.class, new JsonDeserializer() { @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)); } } 

输出:

 {"field1":"","field2":"value"} Bean{field1='null', field2='value'} 

来自Jersey maillist:

还有一件事:要忽略空值,您可能还需要提供自己的Jackson ObjectMapper提供程序,并将Jackson SerializationConfig.Feature WRITE_NULL_PROPERTIES [3]设置为false。 有关如何将自定义ObjectMapper挂钩到Jersey的详细信息,请参阅[2]。

HTH,

〜的Jakub

[2] http://download.java.net/maven/2/com/sun/jersey/samples/jacksonjsonprovider/1.6-ea06/jacksonjsonprovider-1.6-ea06-project.zip [3] http://jackson.codehaus .ORG / 1.7.0 /的Javadoc /组织/ Codehaus的/jackson/地图/ SerializationConfig.Feature.html#WRITE_NULL_PROPERTIES

我想这是你的答案。