Ссылочный объект Джексона, созданный из родительского узла - PullRequest
0 голосов
/ 03 июня 2018

У меня есть следующая модель данных в формате 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, как я могу сказать Джексонусоздать объекты Bar s, используя созданный объект Foo из родительского узла?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Следующий код работает и добавьте ссылку Foo в поле Bar.Основной класс:

 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;
    }
}

Внимание!Но лучший вариант - использовать внутренний класс.Тогда вы легко получите ссылку на экземпляр Foo.

0 голосов
/ 03 июня 2018

Чтобы десериализовать ваш 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...