没有注释的杰克逊是否绝对需要制定者?

duf*_*ymo 17 java jackson

我正在使用Jackson 1.6.4和Java JDK 6.

我不想使用杰克逊注释; 我想拥有不带setter的不可变Java对象.

这两个要求似乎有冲突.

如果我添加私有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);
   }
}
Run Code Online (Sandbox Code Playgroud)

Sta*_*Man 18

很高兴听到你让它工作 - 改变自动检测可见性水平的能力是一个非常强大的功能,但有很多功能,找到所有的功能并不是一件容易的事.

一些额外的指针:如果你不想在POJO中添加杰克逊注释,你仍然可以使用混合注释.有了这个,你可以使用@JsonCreator指定非默认的构造函数来使用,让真正的不可变的值类型(杰克逊和稳定的类型更多的这篇文章).

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

  • 我不需要任何注释,因为我不想将对 Jackson 的依赖构建到我的域模型中。我通过将序列化移动到一个单独的 Mapper 接口中来管理它,该接口具有 Jackson 和 XML 的实现。 (3认同)