我的地图如下:
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中有没有其他方法可以做到这一点?
答案 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 - 了解详情。