16


一部のオブジェクトの定義に自己参照があるため、Jackson を使用して休止状態のオブジェクトを JSON に変換するときに問題が発生します。問題は、それらのエンティティのコードを制御していないため、そこに注釈を入れることができないことです。

実際には、再帰性の深さを、たとえば 5 レベルに制限したいと思います。自己参照を含む任意のエンティティ オブジェクトで動作する汎用コードが必要です。それは可能ですか? 別の JSON ライブラリを使用してもかまいません。

次の簡単なコード

ObjectMapper mapper = new ObjectMapper();

Query q = session.createQuery("from Hazard ");
List<Hazard> hazards = q.list();

for (Hazard h : hazards) {
    String hazardJson;
    hazardJson = mapper.writeValueAsString(h);
}

私に例外を与えます:

org.codehaus.jackson.map.JsonMappingException: サイクルにつながる直接的な自己参照 (参照チェーンを介して: com.fgm.imsma.pojo.Hazard["location"]->com.fgm.imsma.pojo.Location["location] "])
    org.codehaus.jackson.map.ser.BeanPropertyWriter._reportSelfReference (BeanPropertyWriter.java:473) で
    org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField (BeanPropertyWriter.java:411) で
    org.codehaus.jackson.map.ser.BeanSerializer.serializeFields (BeanSerializer.java:245) で
    org.codehaus.jackson.map.ser.BeanSerializer.serialize (BeanSerializer.java:212) で
    org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField (BeanPropertyWriter.java:428) で
    org.codehaus.jackson.map.ser.BeanSerializer.serializeFields (BeanSerializer.java:245) で
    org.codehaus.jackson.map.ser.BeanSerializer.serialize (BeanSerializer.java:212) で
    org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue (StdSerializerProvider.java:587) で
    org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue (StdSerializerProvider.java:245) で
    org.codehaus.jackson.map.ObjectMapper._configAndWriteValue (ObjectMapper.java:1993) で
    org.codehaus.jackson.map.ObjectMapper.writeValueAsString (ObjectMapper.java:1595) で
    imsma.json.GetObjects.main(GetObjects.java:47) で

提案をお寄せいただきありがとうございます。

4

1 に答える 1

22

Jackson 2.0を使用- 循環参照を処理します (@JsonIdentityInfo注釈付き)

クラスに直接注釈を追加できない場合は、MixIn 注釈を使用します。ここに例があります: https://github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotations

于 2012-05-04T18:14:15.283 に答える