【问题标题】:Java map object to several variants JSONJava 将对象映射到几个变体 JSON
【发布时间】:2019-02-08 07:32:58
【问题描述】:
如何在没有链 DOMAIN_OBJECT->DTO->JSON 的情况下将域对象映射到多个变体 JSON 对象(多个 DTO)?我有一个大的域对象和十多个表示变体。当我使用 structMap 将域对象映射到特定的 DTO,然后使用 jackson 对 JSON 进行序列化时,我花了很多时间。
是否有任何工具可以将域对象映射到没有中间层 DTO 的多个变体 JSON?
【问题讨论】:
标签:
java
json
serialization
jackson
【解决方案1】:
我不太了解您的用例,但请注意,如果您使用 Jackson,我想您使用的是 ObjectMapper。 ObjectMapper 是一个昂贵的对象,你应该尽可能地重用它(ergo,声明它static 和final),因为当同一个对象被转换很多次时,它会在后台进行大量缓存。
更好的是,从ObjectMapper 获取ObjectWriter 和/或ObjectReader,它们是不可变且线程安全的(如果您想在运行时更改其配置,ObjectMapper 会很棘手),它们应该会提高您的性能.
最后一件事,但我从未走得那么远,您可以编写自定义序列化器/反序列化器,但我发现复杂性明显增加(因此,维护起来会更加困难)。
如果您使用字符串,请仔细检查您是否使用了 StringBuilder(或多线程用例中的 StringBuffer)并仅在必要时记录 (if(logger.isDebugEnabled() { log.debug(...) }),它们是降低性能的常见缺陷。
【讨论】:
-
如果 OP 不愿意编写 DTO 并使用 MapStruct,我几乎不认为自定义 Jackson 序列化器和反序列化器会成为他的选择。
【解决方案2】:
这真的取决于你的十多个变体是什么样的。有时,坚持 DTO 可能是最好的方法,如 answer 中所述,其中 DTO 用于定义 REST API 的合同。
或者,根据您的需要,您可以使用来自 Jackson 的 @JsonView。使用弹簧?这个answer 可能会给你一些见解。