从父节点

时间:2018-06-03 16:54:03

标签: java json jackson json-deserialization

我有以下json格式的数据模型:

{ 
  "foo":{
    "foo_property": 1,
    "foo_property2": 2,
    "bars":[
      {"bar_property": 3},
      {"bar_property": 9},
      ...
    ]
}

我的对象模型如下:

public class Foo{
    private int foo_property;
    private int foo_property2;
}

public class Bar{
    private Foo foo;
    private int bar_property;

    public Bar(Foo foo){
        this.foo = foo;
    }
}

在反序列化json结构时,如何告诉Jackson使用父节点中创建的Bar对象创建Foo个对象?

2 个答案:

答案 0 :(得分:1)

下一代码可以在Bar字段中使用并添加Foo引用。 主要课程:

 String jsonString = "{...}";
        ObjectMapper objectMapper = new ObjectMapper();
        Complex complex = objectMapper.readValue(jsonString, Complex.class);

复杂类聚合Foo实例并添加对Bar的引用:

public class Complex {

    private Foo foo;

    public void setFoo(Foo foo) {
        this.foo = foo;
        for(Bar bar : foo.getBars()) {
            bar.setFoo(foo);
        }
    }
}

还需要改变Foo类:

public class Foo {

    private int foo_property;
    private int foo_property2;
    private List<Bar> bars;

    public Foo() {;
    }

    public void setBars(List<Bar> bars) {
        this.bars = bars;
    }

    public List<Bar> getBars() {
        return bars;
    }

    public void setFoo_property(int foo_property) {
        this.foo_property = foo_property;
    }

    public void setFoo_property2(int foo_property2) {
        this.foo_property2 = foo_property2;
    }
}

和Bar课程:

public class Bar {

    private Foo foo;
    private int bar_property;

    public Bar() {
    }

    public void setFoo(Foo foo) {
        this.foo = foo;
    }

    public void setBar_property(int bar_property) {
        this.bar_property = bar_property;
    }
}

NB!但更好的变体 - 使用内部阶级。然后,您可以轻松获得对Foo实例的引用。

答案 1 :(得分:0)

为了反序列化您的JSON,请使类与JSON类似。

根据JSON结构,Foo是父节点,Bar是其中的JSONArray。使用以下类,您的反序列化应该完美。

public class Foo{
    private int foo_property;
    private int foo_property2;
    private List<Bar> bars;
}

public class Bar{
    private int bar_property;

    public Bar(Foo foo){
        this.foo = foo;
    }
}