我使用Jersey 1.18并启用了POJOMappingFeature。
我想要所有传入和放大要从null
转换为空字符串的传出JSON值。
如何配置映射? 我已经搜索过网页,但无法找到我正在寻找的内容。
来自我的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>
和控制器的一个例子:
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
答案 0 :(得分:3)
如果您使用Jackson,则可以为pojos编写自定义序列化程序。例如:
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());
}
}
}
然后,在Foo
对象上:
@JsonSerialize(using = FooSerializer.class)
public class Foo {
private String bar;
public String bar() {
return bar;
}
}
您还可以通过扩展JsonDeserializer
来处理传入的空值,或者使用过滤器来解析主体来创建自定义反序列化器吗?
答案 1 :(得分:1)
如果您使用的是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));
}
}
输出:
{"field1":"","field2":"value"}
Bean{field1='null', field2='value'}
答案 2 :(得分:0)
来自Jersey maillist:
还有一件事:忽略空值,你可能也会 需要提供自己的Jackson ObjectMapper提供程序 与Jackson SerializationConfig.Feature WRITE_NULL_PROPERTIES [3] 设为false。有关如何挂钩自定义的详细信息,请参阅[2] ObjectMapper进入泽西岛。
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/org/codehaus/jackson/map/SerializationConfig.Feature.html#WRITE_NULL_PROPERTIES
我认为这是你的答案。