【发布时间】:2012-04-30 02:23:15
【问题描述】:
我有一个数据结构 BookCollection,其中包含一组书籍。每本书都有对其所在的 BookCollection 的引用。这是标准的一对多关系。它在服务器端运行良好,但随后我必须将其发送到客户端。该应用程序使用 Jackson ObjectMapper 进行序列化,设置为 Spring Bean。问题是你不能简单地序列化 BookCollection 和 Books,因为标准 JSON 中没有引用(我确实需要标准 JSON)。
当前的解决方案是将@JsonIgnore 放在Book.collection 字段上,或者更高级,将@JsonManagedReference 放在BookCollection.books 上,将@JsonBackReference 放在Book.collection 上。然而,这并不能解决我所有的问题,一些请求要求一个 Book 对象,并希望得到它的 BookCollection。
最终,我正在寻找某种方法来告诉序列化程序只包含每个对象一次。因此,当我拿到一本书时,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# 及其扩展”和“专家级 Java”也有对集合对象的引用,但它没有被序列化,因为它已经被序列化了。此外,集合对象不包括“JSON 简介”一书,因为它已经被序列化了。
当我要求 BookCollection 时,我得到了:
{
name: "Programming Book",
books: [
{
isbn: 125412416,
title: "Introduction to JSON"
},
{
isbn: 18723425,
title: "Java for experts"
},
{
isbn: 82472347,
title: "C# and its extensions"
},
]
}
将字段序列化一次
虽然 BookCollection 的连载非常出色,但 Book 有点令人困惑,因为目录现在有一些书籍(缺少原版)。更好的是允许指定将每个 field 序列化一次。让 Book.collection 被允许序列化一次
序列化一本书将如下所示:
{
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"
},
]
}
【问题讨论】:
标签: json serialization spring-mvc orm jackson