2013-06-25 91 views
15

我想创建一个对象作为JSON传入的内部类类型,但虽然我已经读了吨在这里以及杰克逊的网站我似乎无法获得所以如果任何人有任何指针,他们将非常感激。我已经在下面发布了一些片段,并删除了所有获得者和安装者,我没有想到他们需要发布。我使用杰克逊2.2。杰克逊杰森类型映射内部类

我试图将类反序列化:

public class Settings { 
    private int offset; 
    private int limit; 
    private String type; 
    private Map<String, Criteria> criteria; 

    public class Criteria { 
    private String restriction; 
    private Object value; 
    } 
} 

的代码我使用的反序列化:

ObjectMapper om = new ObjectMapper(); 
TypeFactory tf = om.getTypeFactory(); 
JavaType map = tf.constructMapLikeType(Map.class, String.class, Criteria.class); 
JavaType type = typeFactory.constructType(Settings.class, map); 
Settings settings = om.readValue(entity, type); 

我的JSON检测数据:

{ "type": "org.json.Car", "criteria": { "restriction": "eq", "value": "bmw" } } 
+1

内部类必须是静态的。请参阅http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – Paul

+0

当按照这些说明,我收到错误:“成员类型[类名称]不能被声明为静态;静态类型只能是声明在静态或顶级类型“ – coltonfranco

+0

有关嵌套类和杰克逊的更多信息,请参阅此博客文章。序列化工作正常,但反序列化不会,除非类是静态嵌套类型 - http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – testerjoe2

回答

4

如果您可以,然后让你的生活变得简单,并将内部类移到一个普通类中,并在Settings类中引用它。然后做用杰克逊编组,这里是你如何对你的类:

public class Settings { 
    private int offset; 
    private int limit; 
    private String type; 
    private Map<String, Criteria> criteria; 
    private Criteria criteria; 
} 


class Criteria { 
    private String restriction; 
    private Object value; 
    } 
+0

这确实是内部类导致所有问题。 – ars265

+3

或使用'static' –

33

正确的答案是,你缺少的内部类static关键字。

只要确保“静态”关键字在那里。

阅读http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html

它需要你03分钟,但会让你一天的休息快乐。

+1

这应该是公认的答案。 –

+0

redochka - 我们如何决定是使用静态嵌套类(你的anwser)还是简单的组合(juned ahsan答案)? – testerjoe2

+0

@ testerjoe2这是个人选择的问题。我使用嵌套的静态类时,我知道它不会在其他地方使用,因为它与托管类紧密相关。如果我要在其他地方使用这门课,我肯定会把它放在单独的课程中。 – redochka