2014-12-29 19 views
0

My below JSON не получает сериализованную серию, когда я отправил через службу отдыха Джерси. Когда googled, я обнаружил, что существует циклическая зависимость, которая вызывает эту проблему.JSON Deserialization и Cyclic dependencies

Не могли бы вы сообщить мне, как решить эту проблему.

{ 
"asset":{ 
    "id":"123456", 
    "price":"12.9", 
    "quantity":"1", 
    "asset":[ 
     { 
      "id":"907", 
      "price":"123" 
     } 
    ] 
    } 
} 

Вот мой класс Java, используемый для сопоставления и публикации данных для WS.

public class Asset { 

private String id; 
private String price; 
private String quantity; 
private List<NestedAssset> asset = new ArrayList<NestedAsset>(); 
    - -- 
getters and setters follows 
} 


public class NestedAsset{ 
    private String id; 
    private String price; 
    - -- 
    getters and setters follows 
} 

Когда JSON отображается в этих POJO и послал для запроса POST, выглядит как потребляя услуги не в состоянии десериализации этих объектов

+0

Не должно быть запятой после «123» – lcryder

+0

Здесь не хватает деталей. –

+0

Определения, приведенные выше, пока не показывают циклической зависимости, если не связаны отношения «Asset» и «NestedAsset». Они? ('NestedAsset extends Asset' или такой) – StaxMan

ответ

0

Используйте @JsonIgnore вместо @XmlTransient разорвать круговую зависимость.

+0

Когда я использую @JsonIgnore, элемент дочернего элемента не получает десериализован и, следовательно, я не могу получить его значение. – skanda

1

Вы должны определить @JsonIdentity аннотацию Джексон разрешить циклические зависимости:

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="childId", scope = Child.class) 

Пример применения:

public class CyclicalDependencyMain { 

    public static void main(String [] args) throws IOException { 
     ObjectMapper objectMapper = new ObjectMapper(); 

     String json = objectMapper.writeValueAsString(generateParent()); 
     System.out.println(json); 

     Parent parent = objectMapper.readValue(json, Parent.class); 
     System.out.println(parent); 

    } 

    public static Parent generateParent() { 
     Parent parent = new Parent(); 
     Child child = new Child(); 

     child.setChildId(1); 
     child.setParent(parent); 

     parent.setParentId(1); 
     parent.setChild(child); 

     return parent; 
    } 
} 

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="parentId", scope = Parent.class) 
class Parent { 
    private int parentId; 
    private Child child; 

    public int getParentId() { 
     return parentId; 
    } 

    public void setParentId(int parentId) { 
     this.parentId = parentId; 
    } 

    public Child getChild() { 
     return child; 
    } 

    public void setChild(Child child) { 
     this.child = child; 
    } 

    @Override 
    public String toString() { 
     return "Parent{" + 
       "parentId=" + parentId + 
       ", child=" + child + 
       '}'; 
    } 
} 

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="childId", scope = Child.class) 
class Child { 
    private int childId; 
    private Parent parent; 

    public int getChildId() { 
     return childId; 
    } 

    public void setChildId(int childId) { 
     this.childId = childId; 
    } 

    public Parent getParent() { 
     return parent; 
    } 

    public void setParent(Parent parent) { 
     this.parent = parent; 
    } 

    @Override 
    public String toString() { 
     return "Child{" + 
       "childId=" + childId + 
       '}'; 
    } 
} 

Выход:

{"parentId":1,"child":{"childId":1,"parent":1}} 
Parent{parentId=1, child=Child{childId=1}} 

Update Решение основано на @JsonManagedReference a й @JsonBackReference

class Parent { 
    private int parentId; 
    @JsonManagedReference 
    private Child child; 
    // getters/setters and everything else 
} 

class Child { 
    private int childId; 
    @JsonBackReference 
    private Parent parent; 
    // getters/setters and everything else 
} 

Этот подход работает хорошо, если вы работаете с классом Родителя как высший класс все время. Такой подход не сработает, если вы захотите сериализовать и/или десериализовать Child как высший класс.

+0

Так как это делает jsonbackreference и jsonbackreference для этого сценария – skanda

+0

@skanda существует одно ограничение использования JsonManagedReference и JsonBackReference. Я добавил пример к решению с подробностями. –