1

書籍のセットを持つデータ構造BookCollectionがあります。各本には、それが含まれているBookCollectionへの参照があります。これは標準の1対多の関係です。サーバー側ではうまく機能しますが、クライアントに送信する必要があります。このアプリは、SpringBeanとして設定されたシリアル化にJacksonObjectMapperを使用します。問題は、標準のJSONには参照がないため(標準のJSONが必要なため)、BookCollectionとBooksを簡単にシリアル化できないことです。

現在の解決策は、@ JsonIgnoreをBook.collectionフィールドに配置するか、より高度な@JsonManagedReferenceをBookCollection.booksに、@JsonBackReferenceをBook.collectionに配置することです。ただし、これですべての問題が解決するわけではありません。一部のリクエストでは、Bookオブジェクトを要求し、そのBookCollectionも取得したいと考えています。

最終的に、各オブジェクトを1回だけ含めるようにSerializerに指示する方法を探しています。したがって、本を入手すると、JSONは次のようになります。

{
  isbn: 125412416,
  title: "Introduction to JSON",
  collection: {
     name: "Programming Books",
     books: [
         {
             isbn: 18723425,
             title: "Java for experts"
         },
         {
             isbn: 82472347,
             title: "C# and its extensions"
         },
     ]
  }
}

「C#とその拡張機能」および「Javafor Experts」にもコレクションオブジェクトへの参照がありますが、すでにシリアル化されているため、シリアル化されていません。また、コレクションオブジェクトには、すでにシリアル化されているため、「IntroductiontoJSON」ブックは含まれていません。

そして、BookCollectionを要求すると、次のようになります。

{
  name: "Programming Book",
  books: [
    {
      isbn: 125412416,
      title: "Introduction to JSON"
    },
    {
      isbn: 18723425,
      title: "Java for experts"
    },
    {
      isbn: 82472347,
      title: "C# and its extensions"
    },
  ]
}

フィールドを1回シリアル化する

BookCollectionは見事にシリアル化されていますが、カタログには現在いくつかの本が含まれているため(オリジナルが欠落しているため)、Bookは少し混乱します。さらに良いのは、各フィールドを1回シリアル化するように指定できるようにすることです。Book.collectionを1回シリアル化できるようにします

ブックのシリアル化は次のようになります。

{
  isbn: 125412416,
  title: "Introduction to JSON",
  collection: {
     name: "Programming Books",
     books: [
         {
             isbn: 18723425,
             title: "Java for experts"
         },
         {
             isbn: 82472347,
             title: "C# and its extensions"
         },
         {
             isbn: 125412416,
             title: "Introduction to JSON"
         }
     ]
  }
}

そして、本のコレクションをシリアル化することも同様です。

{
  name: "Programming Book",
  books: [
    {
      isbn: 125412416,
      title: "Introduction to JSON"
    },
    {
      isbn: 18723425,
      title: "Java for experts"
    },
    {
      isbn: 82472347,
      title: "C# and its extensions"
    },
  ]
}
4

2 に答える 2

1

私は最近、同様の問題に遭遇しました:ジャクソン - 二項関係を持つエンティティのシリアル化 (サイクルの回避)

したがって、解決策は、Jackson 2.0 にアップグレードし、クラスに次の注釈を追加することです。

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, 
                  property = "@id")
public class SomeEntityClass ...
于 2012-04-20T15:04:02.430 に答える