Строка json дочернего объекта для родительского объекта - PullRequest
0 голосов
/ 22 марта 2019

Строка JSON наследование дочернего объекта родительского объекта

Базовый класс кода

public class A {

    int x;

    int y;

    int z;

    public A(int x, int y, int z) {

        this.x = x;

        this.y = y;

        this.z = z;

    }

}

Детский класс:

public class B  extends A {
   int i;
   int j ;

   public B(int x, int y, int z, int i, int j) {

       this.i = i;

       this.j = j;

       super(x,y,z);

   }

}

B b = new B();
// converting the obj to class obj 
String s = new ObjectMapper().writeValueAsString(b);

A a = new  ObjectMapper().convertValue(s, A.class);

B bb = (B) b;

Я не могу этого достичь. Поскольку родительский класс не имеет всех полей.

Произошло падение значений атрибута

Объект А пропустит некоторые значения и не сможет конвертировать родительский объект для дочернего объекта.

Как мы можем преобразовать это правильно Должны ли мы добавить @ JsonProperty

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Сначала вы должны добавить открытый конструктор без параметров в оба класса, затем вы можете попробовать это:

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
        mapper.enableDefaultTyping();
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        // converting the obj to class obj
        String s = mapper.writeValueAsString(b);
        A a = mapper.readValue(s, A.class);

        B bb = (B) b;

ОБНОВЛЕНИЕ

Вы также можете добавить аннотацию к классу A:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS)

А затем сделайте следующее:

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
       // converting the obj to class obj
        String s = mapper.writeValueAsString(b);
        A a = mapper.readValue(s, A.class);

        B bb = (B) b;
0 голосов
/ 22 марта 2019

Вы можете добавить @JsonIgnoreProperties (ignoreUnknown = true) перед объявлением класса A, как показано ниже.

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)

class A {

 //
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...