我想在多个线程中的多个不同上下文中对JSON进行反序列化(反序列化),这些上下文需要稍微不同的Jackson配置。根据Web和类注释中的资源,应该使用从具有“基本”配置的ObjectMapper构造的ObjectWriter和ObjectReader做到这一点。但是,我还没有从ObjectMapper构建不可变的ObjectWriter,它似乎与映射器一起更改了它的配置。
这是重新配置WRITE_NUMBERS_AS_STRINGS的示例。请将此视为“仅作为示例”,这是事实,我需要一个针对ObjectReader和ObjectWriter以及各种配置对象(例如@JacksonInject的值)的解决方案,而不仅仅是低级JSON格式选项。
public class Main3 {
public static void main(String[] args) throws Exception {
test(false);
test(true);
}
private static void test(boolean enable) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.disable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
ObjectWriter w1 = mapper.writer();
if (enable) {
mapper.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
}
ObjectWriter w2 = mapper.writer();
Bean b = new Bean();
b.setX(42);
System.out.println(w1.writeValueAsString(b));
System.out.println(w2.writeValueAsString(b));
}
public static class Bean {
private int x;
/**
* Getter method.
*
* @return the x
*/
public int getX() {
return x;
}
/**
* Setter method.
*
* @param x the x
*/
public void setX(int x) {
this.x = x;
}
}
}
如您所见,我正在运行两次相同的测试,每次都从同一ObjectMapper创建两个ObjectWriter,并使用它们中的每个序列化一个测试bean。在第二轮中,我为第二个作家启用WRITE_NUMBERS_AS_STRINGS。这似乎也影响了第一位作家。
预期产量:
{"x":42}
{"x":42}
{"x":42}
{"x":"42"}
实际输出:
{"x":42}
{"x":42}
{"x":"42"}
{"x":"42"}
还有什么需要将ObjectWriter与ObjectMapper分离的吗?不用说,在此基础上构造一个违反线程安全性的示例应该是微不足道的,更不用说ObjectWriter显然不是不可变的。
最佳答案
这些文档似乎确实声称读者和作者是一成不变的。如果发现它们不存在的情况,则应将其报告为错误。
但是,与此同时,您可以复制ObjectMapper
的副本,然后从该副本创建writer
。