Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否要将null转换为空字符串?_Java_Json_Jersey - Fatal编程技术网

Java 是否要将null转换为空字符串?

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

我正在使用Jersey 1.18,并且启用了POJOMappingFeature。 我希望所有传入和传出的JSON值都从
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'}