没有注释的杰克逊绝对需要二传手吗?

2022-09-02 22:00:26

我使用的是 Jackson 1.6.4 和 Java JDK 6。

我不想使用杰克逊注释;我希望有不可变的Java对象,没有 setter。

这两个要求似乎相互冲突。

如果我添加私有 setter,反序列化工作正常。

我试图不为我不变的对象求助于私人设置者 - 我以这种方式很固执。

我正在尝试VisibilityChecker的自定义实现以允许任何字段访问。

但是,如果有人有一些建议或经验教训可以分享,我很乐意听到他们。

更新:它正在工作。

构建器模式,私有构造函数 - 一个 la Bloch “Effective Java”。

设置反序列化配置和可见性需要,但现在很好。

public class JsonMapper
{
   private static final int INITIAL_SIZE = 2048;
   /** See http://wiki.fasterxml.com/JacksonBestPracticeThreadSafety?highlight=(\bCategoryJackson\b) */
   private static ObjectMapper mapper;

   static
   {
      mapper = new ObjectMapper();

      mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
      SerializationConfig serializationConfig = mapper.getSerializationConfig();
      serializationConfig.setDateFormat(Person.DEFAULT_FORMATTER);

      mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
      DeserializationConfig deserializationConfig = mapper.getDeserializationConfig();
      deserializationConfig.setDateFormat(Person.DEFAULT_FORMATTER);
      deserializationConfig.enable(DeserializationConfig.Feature.AUTO_DETECT_FIELDS);
      mapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));
   }

   public static <T> String serialize(T o) throws IOException
   {
      StringWriter sw = new StringWriter(INITIAL_SIZE);
      mapper.writeValue(sw, o);

      return sw.toString();
   }

   public static <T> T deserialize(String source, Class<T> targetClass) throws IOException
   {
      ByteArrayInputStream stream = new ByteArrayInputStream(source.getBytes());
      TreeTraversingParser treeTraversingParser = new TreeTraversingParser(mapper.readTree(stream));
      treeTraversingParser.setCodec(mapper);

      return treeTraversingParser.readValueAs(targetClass);
   }
}

答案 1

很高兴听到您让它工作 - 更改自动检测可见性级别的能力是一个非常强大的功能,但是有这么多的功能,找到所有功能并非易事。

几个额外的指针:如果您不想在POJO中添加Jackson注释,您仍然可以使用混合注释。这样,您可以使用@JsonCreator来指定要使用的非默认构造函数,该构造函数允许真正的不可变值类型(有关 Jackson 的更多信息,请参阅本文)。

最后:虽然尚未直接支持构建器模式,但已按照此 Jira 条目进行了规划。


答案 2

推荐