書籍のセットを持つデータ構造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"
},
]
}