我想在多个线程中的多个不同上下文中对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

07-24 14:51