java - 有条件序列化集合字段最佳实践?

标签 java json jersey jackson

我已经有了解决问题的方法,稍后我会描述它,但我不喜欢它,所以我才问。

我正在使用最新的 Jersey 和 jackson 库。我有一个实体的休息服务,到目前为止,我有 2 个 get 方法:getById 和 getList,都使用 jackson 返回 json。该实体使用 OneToMany 关系引用自身,因此它是一组实体。对于 getList,我不希望该字段被序列化,而对于 getById,我希望它以我自己的方式被序列化。

我的解决方案是:

对于 getList,我使用字段上的 View 在实体 bean 中,我使用 JsonView 类 FirstLevelOfCollection:

@JsonView(JacksonViews.FirstLevelOfCollection.class)

在rest服务getList方法中,我使用Object作为 View 过滤器,因此将包含所有不带@JsonView的字段:

ObjectMapper mapper = new ObjectMapper();
resultString = mapper.writerWithView(Object.class).writeValueAsString(resultObject);

对于 getById,我使用自定义序列化

ObjectMapper mapper = new ObjectMapper();
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null, null, null));
testModule.addSerializer(Set.class, new EndEventCodesSerializer(Set.class));
mapper.registerModule(testModule);
resultString  = mapper.writeValueAsString(resultObject);

我无法使用 @JsonIgnore 插入 View ,因为自定义序列化也不会看到它。它有效,但看起来很奇怪和丑陋,特别是排除这样的字段,我也想实现但我不知道如何默认对所有 future 的请求使用排除(getList 行为)。我能有更好的解决方案吗?

最佳答案

好吧,我采纳了 Adam Gent 的建议。 我将 @JsonIgnore 放在所有引用字段上,实现了几个 DTO,它们只是我的实体类的包装器,并且我使用这些 DTO 在其余服务中进行响应。

关于java - 有条件序列化集合字段最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27078578/

相关文章:

java - 在 apache-karaf 中查看 osgi 修订版的命令

java - REST/jersey 和 JSON 的问题

java - 将javax.ws.rs实体序列化为json

php - 在android中使用okhttp将数组或jsonobject传递给php url?

javascript - 具有未知数组键的引用 Javascript 数组(JSON 格式)

java - Jersey REST 服务的响应不包含空字段

java - 使用 jersey-json 将字段名称与空格映射

java - 在 java 构建路径中引用错误的 jar 文件

java - 使用泰勒级数计算 cos(x)

java - getSupportLoaderManager(id, args, ??) 的第三个参数类型是什么