我正在使用Jackson 1.6.4和Java JDK 6.
我不想使用杰克逊注释;我想拥有不带setter的不可变Java对象。
这两个要求似乎有冲突。
如果我添加私有setter,反序列化工作正常。
我正试图不让私人制定者为我的不可变对象 - 我很顽固。
我正在尝试VisibilityChecker的自定义实现,以允许任何字段访问。
但如果有人得到一些建议或经验教训,他们可以分享,我很感激听到他们。
更新:它正在运作。
Builder模式,私有构造函数 - 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);
}
}
答案 0 :(得分:18)
很高兴听到你让它发挥作用 - 改变自动检测可见性水平的能力是一个非常强大的功能,但有很多功能,找到所有功能并不容易。
其他一些指示:如果您不想在POJO中添加杰克逊注释,您仍然可以使用mix-in annotations。有了这个,你可以使用@JsonCreator指定要使用的非默认构造函数,它允许真正的不可变值类型(更多关于杰克逊和this article上的不可变类型。)
最后:虽然尚未直接支持构建器模式,但它已根据this Jira entry进行了规划。