【问题标题】:Serialize HashMap to a JSON string while avoiding certain fields in Java将 HashMap 序列化为 JSON 字符串,同时避免 Java 中的某些字段
【发布时间】:2015-05-27 06:53:48
【问题描述】:

我有一张地图如下:

Map map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");

我需要将此地图转换为 JSON 字符串。我知道这可以使用 Jackson 来完成,如下所示:

new ObjectMapper().writeValueAsString(map);

问题是,我不想将key3 映射到字符串。输出字符串应如下所示:

{"key1":"value1","key2":"value2"}

在将 HashMap 序列化为 String 时,有什么方法可以避免某些字段来自 HashMap?此外,我想在序列化时将某些字段添加到字符串中。例如,我需要添加一个名为“key4”的字段,其值为“value4”。因此,最终的字符串应该是:

{"key1":"value1","key2":"value2","key4":"value4"}

我如何使用 Jackson 来做到这一点?或者在 Java 中有没有其他方法可以做到这一点?

【问题讨论】:

  • 为什么不在序列化之前修改Map呢?删除key3并添加key4

标签: java json jackson


【解决方案1】:

如果你想像这样序列化HashMap,你应该实现一个自定义序列化器。这是一个例子:

public class CustomSerializer extends StdSerializer<Map> {
    protected CustomSerializer() {
        super(Map.class);
    }

    @Override
    public void serialize(Map map, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException {
        jsonGenerator.writeStartObject();
        for (Object key : map.keySet()) {
            if(!"key3".equals(key)){
                jsonGenerator.writeStringField((String) key, (String) map.get(key));
            }
        }
        jsonGenerator.writeStringField("key4","value4");
        jsonGenerator.writeEndObject();
    }
}

public class Main {

    public static void main(String[] args) throws Exception{

        Map<String, String> map = new HashMap<>();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");

        ObjectMapper mapper = new ObjectMapper();
        SimpleModule serializerModule = new SimpleModule("SerializerModule", new Version(1, 0, 0, null, "mt", "customSerializerTest"));
        serializerModule.addSerializer(new CustomSerializer());
        mapper.registerModule(serializerModule);

        System.out.println(mapper.writeValueAsString(map));
    }
}

Output:
{"key1":"value1","key2":"value2","key4":"value4"}

【讨论】:

    【解决方案2】:

    如果你在序列化一个POJO,你可以使用@JsonIgnore注解,但是在这种情况下,这不是一个选项,所以你应该复制HashMap,然后对它做任何操作,什么你需要。

    【讨论】:

      【解决方案3】:

      您可以尝试 Jackson 自定义序列化程序 - http://wiki.fasterxml.com/JacksonHowToCustomSerializers。我认为这对您的用例来说是一个方便的选择。使用自己的序列化程序,您可以在 serialize 方法中进行透明对象处理 - 例如,您可以将映射复制到另一个避免某些字段等。

      【讨论】:

        【解决方案4】:

        最简单的方法就是修改地图。

        但是,如果您愿意,您实际上也可以在 Map 类型上使用 @JsonIgnoreProperties。所以,类似:

        @JsonIgnoreProperties({ "key3" })
        public class MyFilteringMap extends HashMap<String,String> { }
        

        无法通过注解添加属性。

        但是可以使用@JsonAnySetter 和@JsonAnyGetter 注释使POJO 看起来像Map。这将允许组合过滤方法,以及一些“标准”属性和其他杂项属性。请参阅此 -- http://www.cowtowncoder.com/blog/archives/2011/07/entry_458.html -- 了解详情。

        【讨论】:

          猜你喜欢
          • 2021-09-16
          • 2017-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-06
          相关资源
          最近更新 更多