gpt4 book ai didi

java - 使用 Jackson 序列化自定义 map

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:08 26 4
gpt4 key购买 nike

我想将自定义 Map 序列化为 JSON。

实现 map 接口(interface)的类如下:

public class MapImpl extends ForwardingMap<String, String> {
//ForwardingMap comes from Guava
private String specialInfo;

private HashMap<String, String> delegate;

@Override
protected Map<String, String> delegate() {
return this.delegate;
}
// some getters....
}

如果我现在打电话

    ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File("/somePath/myJson.json"), objectOfMapImpl);

Jackson 将序列化 map 并忽略变量 specialInfo

我用 JsonSerializer 的自定义实现尝试了一些东西,但我最终得到了这个片段:

    ObjectMapper mapper = new ObjectMapper();

SimpleModule module = new SimpleModule("someModule");



module.addSerializer(CheapestResponseDates.class, new JsonSerializer<MapImpl>() {

@Override
public void serialize(final MapImpl value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException, JsonProcessingException {
CheapestResponseDurations.class);
// how to serialize the map here? maybe be in a data node...
jgen.writeStartObject();
jgen.writeObjectField("info", value.getInfo());
jgen.writeEndObject();
}
});


mapper.registerModule(module);

我正在使用 JDK 1.7 和 Jackson 2.3.1

最佳答案

您可以利用@JsonAnySetter/@JsonAnyGetter 注释,如this blog post 中所述。 .因为,正如您提到的,您的自定义 map 类必须实现一个 Map 接口(interface),您可以提取一个单独的“bean”接口(interface),并告诉 Jackson 在通过 @JsonSerialize(as = ...) 注释进行序列化时使用它。

我稍微修改了你的例子来说明它是如何工作的。请注意,如果你想将 json 字符串反序列化回你的 map 对象,你可能需要做一些其他的技巧。

public class MapSerialize  {
public static interface MyInterface {
String getSpecialInfo();

@JsonAnyGetter
Map<String, String> delegate();
}

@JsonSerialize(as = MyInterface.class)
public static class MyImpl extends ForwardingMap<String, String> implements MyInterface {

private String specialInfo;
private HashMap<String, String> delegate = new HashMap<String, String>();

public Map<String, String> delegate() {
return this.delegate;
}

@Override
public String getSpecialInfo() {
return specialInfo;
}

public void setSpecialInfo(String specialInfo) {
this.specialInfo = specialInfo;
}

@Override
public String put(String key, String value) {
return delegate.put(key, value);
}
}

public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
MyImpl objectOfMapImpl = new MyImpl();
objectOfMapImpl.setSpecialInfo("specialInfo");
objectOfMapImpl.put("XXX", "YYY");
String json = mapper.writeValueAsString(objectOfMapImpl);
System.out.println(json);
}

关于java - 使用 Jackson 序列化自定义 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23103235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com