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

时间:2014-07-19 15:56:34

标签: java json jersey

我使用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

3 个答案:

答案 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

我认为这是你的答案。