4

我正在序列化一个注册了很多 JsonSerializers 的复杂树,但我缺少一个可用于存储数据的上下文。例如,假设您需要对树中的节点进行 i18n 本地化,并且您必须根据正在序列化的树中的当前位置来组合本地化键。知道该怎么做吗?JsonGenerator 和 SerializerProvider 不提供类似的东西。

@Override
public void serialize(TreeSection value, JsonGenerator jgen, SerializerProvider provider) {
    // MISSING some kinda context here
}
4

2 回答 2

1

您最好的选择是ThreadLocal用于传递此类信息。

您还可以在https://github.com/FasterXML/jackson-databind/issues请求添加一些有限形式的上下文存储——这听起来是一个合理的请求。

于 2013-08-23T20:38:01.150 回答
0

我能够使用杰克逊 2.7.3 的属性(不确定线程​​安全性,因为我每次都在创建一个新的映射器):

public ObjectWriter getWriter() {
   Map<String, String> map = new HashMap<>();
   map.put("my.msg", "message");
   map.put("my.msg2", "message2");
   return new ObjectMapper().writer().withAttributes(map);
}

在序列化程序类中:

@Override
public void serialize(TreeSection value, JsonGenerator jgen, SerializerProvider provider) {
    String msg = (String) provider.getAttribute("my.msg");
}

更新: 当多个对象嵌套在序列化中时无法正常工作。似乎属性仅传递给序列化的第一个对象。似乎与https://github.com/FasterXML/jackson-databind/issues/1991有关

于 2018-09-24T10:07:44.897 回答