2017-01-16 16 views
1
interface Foo 
    public String key() 

class Bar implements Foo 
    public int id; 
    public String name; 
    public Bar2 bar2; <--- bar2.key() should be used as json value 
    String key() { return name } 

class Bar2 implements Foo 
    public int id; 
    public int name; 
    public Bar bar; <--- bar.key() should be used as json value 
    String key() { return name } 

Всякий раз, когда какой-либо объект типа Foo ссылается в сериализации, это значение должно быть object.key(). Для десериализации значения следует использовать для поиска фактического объекта (Bar, Bar2 и т.д.)Джексон: идентичность объекта serializaton/десериализации на основе реализованного интерфейса

Как это может быть сделано с Джексоном?

ответ

0

Вам нужен метод геттера для общей собственности. Измените Foo на абстрактный класс и определите там свойство и метод getter.

public abstract class Foo implements Serializable{ 
    public String name; 
    public Foo bar; 

    public Foo() { 
    } 

    public String getBar(){ 
     return bar.name; 
    } 

    public void setBar(Foo bar) { 
     this.bar = bar; 
    } 
} 

class Bar extends Foo{ 
    public int id; 

    public Bar() { 
    } 

    public static void main(String[] args) throws JsonProcessingException { 
     ObjectMapper mapper = new ObjectMapper(); 
     Bar bar = new Bar(); 
     Bar2 bar2 = new Bar2(); 
     bar.id = 1; bar.name = "bar1";bar.setBar(bar2); 
     bar2.id = 2; bar2.name = "bar2"; bar2.setBar(bar); 

     System.out.println(mapper.writeValueAsString(bar)); 
    } 
} 

public class Bar2 extends Foo { 
    public int id; 

    public Bar2() { 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^