2016-05-18 17 views
4

ジャクソン2の@JsonIdentityInfoをhereのように使用しようとしています。もちろん循環参照で@JsonIdentityInfoを使用するにはどうすればよいですか?

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

、単純なアプローチのfailes:

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

クラスAおよび/またはクラスBに@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")を追加すると、いずれかの動作しません。私は、次の2つのクラスを作成したテストのため

私はこのような何かにa私はシリアライズ(以降デシリアライズ)ができることを期待していた:(JSONについてあまりわからないが)

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

私はそれをどのように行うことができますか?

+0

これは私にとってうまく動作し、 '{" @id ":1、" b ":{" @ id ":2、" a ":1}}'を生成します。 –

+0

奇妙な。私はjackson-jr-all-2.7.4.jarとcom.fasterxml.jackson.jr.ob.JSONを使用しています。どのようなJSONクラスを使用しましたか?両方のクラスのアノテーションを使用していますか? – Burkhard

+0

私は 'ObjectMapper'を作成し、' writeValueAsString'を使用しました。 (これはあなたの '@JsonIdentityInfo'アノテーションにあります) –

答えて

7

jackson-jrはジャクソンの機能のサブセットを持っているようです。 @JsonIdentityInfoはカットしてはいけません。

完全なジャクソンライブラリを使用できる場合は、ObjectMapper@JsonIdentityInfo注釈付きの標準を使用して、あなたのオブジェクトをシリアル化してください。例えば

@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 */} 

、次いで

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

は、ネストされたa@idによってルートオブジェクトを参照され

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

を生成します。いくつかのケースでは

+0

@ Sotirios Delimanolis jsonレスポンスで" @id "を無視する方法はありますか? – SuRa

+1

@SuRaあなたは_ignore_とはどういう意味ですか?これは、オブジェクトを識別するプロパティ(任意の名前を持つことができる)を提供するための '@ JsonIdentityInfo'のポイントです。 –

+0

残りのクライアントからデータを取得中、<< com.fasterxml.jackson.databind.JsonMappingException:Integral number(1)から[simple type、class name]型の値をインスタンス化できません。単一のint-argコンストラクタ/ファクトリメソッド>>例外はありません。これを修正するには?入れ子になった "a":1は問題を引き起こします。 – SuRa

0

、それは例えば@JsonProperty(「ID」)

同上プロパティに注釈を付けることが必要になることが、私の場合には、これは私のアプリケーションが正しく実行されました。

+0

これはすでに受け入れられている回答の一部です。その答えに追加したいことがありますか新しいことはありますか? –

関連する問題