2011-01-27 77 views
16

我正在使用Jackson 1.6.4和Java JDK 6.没有注释的杰克逊绝对需要安装者吗?

我不想使用Jackson注释;我想在没有setter的情况下拥有不可变的Java对象。

这两个要求似乎有冲突。

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

我试图不求助于我的不可变对象的私人setter - 我固执的那种方式。

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

但是,如果任何人有一些建议或经验教训,他们可以分享我会很高兴听到他们。

更新:它的工作。

构建模式,私人构造函数 - 拉布洛赫“有效的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

如果你的课是不可改变的,杰克逊应该如何填充它们? – skaffman 2011-01-27 22:49:44

+0

建设者模式 – duffymo 2011-01-28 00:37:20

回答

17

很高兴听到你做它的工作 - 改自动检测能见度水平的能力是非常强大的功能,但也有这么多的功能,这是不平凡的找到所有有。

几个附加指针:如果您不想在POJO中添加Jackson注释,则仍然可以使用mix-in annotations。有了这个,你可以使用@JsonCreator来指定要使用的非默认构造函数,它允许真正的不可变值类型(更多关于Jackson和this article上的不可变类型)。

最后:虽然构建器模式尚未直接支持,但它已按照this Jira entry计划。