将HashMap序列化为JSON字符串,同时避免使用Java中的某些字段

时间:2015-05-27 06:53:49

标签: java json jackson

我的地图如下:

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

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

new ObjectMapper().writeValueAsString(map);

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

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

在将序列化为字符串时,有没有办法避免HashMap中的某些字段?此外,我想在序列化时向String添加某些字段。例如,我需要添加一个名为&#34; key4&#34;的字段。值为&#34; value4&#34;。因此,最终的String应该是:

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

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

4 个答案:

答案 0 :(得分:3)

如果要像这样序列化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"}

答案 1 :(得分:1)

如果您正在序列化POJO,则可以使用@JsonIgnore注释,但在这种情况下,这不是一个选项,因此您应该复制HashMap,并执行任何操作在它上面,你需要什么。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

最简单的方法是修改Map。

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

Map

无法通过注释添加属性。

但是可以使用@JsonIgnoreProperties({ "key3" }) public class MyFilteringMap extends HashMap<String,String> { } @JsonAnySetter注释使POJO看起来像@JsonAnyGetter。这将允许组合过滤方法,以及一些“标准”属性和其他misc属性。请参阅此内容 - http://www.cowtowncoder.com/blog/archives/2011/07/entry_458.html - 了解详情。