2016-05-18 1 views
4

J'essaie d'utiliser le @JsonIdentityInfo de Jackson 2 comme décrit here.Comment utiliser @JsonIdentityInfo avec des références circulaires?

Pour des fins de test j'ai créé les deux catégories suivantes:

public class A 
{ 
    private B b; 
    // constructor(s) and getter/setter omitted 
} 
public class B 
{ 
    private A a; 
    // see above 
} 

Bien sûr, les failes approche naïve:

@Test 
public void testJacksonJr() throws Exception 
{ 
    A a = new A(); 
    B b = new B(a); 
    a.setB(b); 
    String s = JSON.std.asString(a);// throws StackOverflowError 
    Assert.assertEquals("{\"@id\":1,\"b\":{\"@id\":2,\"a\":1}}", s); 
} 

Ajout @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") à la classe A et/ou B ne fonctionne pas non plus .

J'espérais que je pouvais sérialisation (et deserialize plus tard) a à quelque chose comme ceci: (pas trop sûr de la JSON bien)

{ 
    "b": { 
     "@id": 1, 
     "a": { 
      "@id": 2, 
      "b": 1 
     } 
    } 
} 

Comment puis-je faire cela?

+0

Cela fonctionne très bien pour moi et génère '{" @id ": 1," b ": {" @ id ": 2," a ": 1}}'. –

+0

Étrange. J'utilise jackson-jr-all-2.7.4.jar et com.fasterxml.jackson.jr.ob.JSON. Quelle classe JSON avez-vous utilisée? Avec l'annotation sur les deux classes? – Burkhard

+0

Je viens de créer un 'ObjectMapper' et d'utiliser' writeValueAsString'. (C'est avec vos annotations '@ JsonIdentityInfo'.) –

Répondre

7

Il semble que jackson-jr possède un sous-ensemble des fonctionnalités de Jackson. @JsonIdentityInfo ne doit pas avoir fait la coupe.

Si vous pouvez utiliser la bibliothèque complète de Jackson, utilisez simplement un ObjectMapper standard avec l'annotation @JsonIdentityInfo que vous avez suggérée dans votre question et sérialiser votre objet. Par exemple

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class A {/* all that good stuff */} 

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class B {/* all that good stuff */} 

puis

A a = new A(); 
B b = new B(a); 
a.setB(b); 
ObjectMapper mapper = new ObjectMapper(); 
System.out.println(mapper.writeValueAsString(a)); 

va générer

{ 
    "@id": 1, 
    "b": { 
     "@id": 2, 
     "a": 1 
    } 
} 

où le a imbriquée fait référence à l'objet racine par son @id.

+0

@ Sotirios Delimanolis Une idée comment ignorer le" @id "dans la réponse de JSON? – SuRa

+1

@SuRa Que voulez-vous dire par _ignore_? C'est le point de '@ JsonIdentityInfo', pour fournir une propriété (elle peut avoir n'importe quel nom) qui identifie l'objet. –

+0

Lors de la récupération des données du client de repos, j'obtiens << com.fasterxml.jackson.databind.JsonMappingException: Impossible d'instancier la valeur de type [type simple, nom de classe] de Integral number (1); pas de méthode constructeur/usine unique-int-arg >> exception. Comment régler ceci? Le "a" imbriqué: 1 causant le problème. – SuRa

0

Dans certains cas, il peut être nécessaire d'annoter la Id propriété avec @JsonProperty (« id »)

Par exemple, dans mon cas, cela fait ma demande de fonctionner correctement.

+0

Cela fait déjà partie de la réponse acceptée. Y a-t-il autre chose ou nouveau que vous aimeriez ajouter à cette réponse? –