【发布时间】:2020-04-21 06:27:14
【问题描述】:
我有一个类需要序列化
public class Abc
{
private long age;
private JaxBElement<Foo> fooWrapper;
// other properties
}
预期的输出 JSON 是
{
"age": 24,
"my_own_key": "my_own_value" // the key should not be "fooWrapper"
限制是不能修改原始类 Abc,因为它是从 xjc 生成的,我还不想使用绑定来探索自定义类。
我已经为 JaxBElement 尝试了自定义序列化程序、bean 修饰符等,所有这些都允许我控制序列化。但他们只在属性的VALUE上工作。他们不允许我更改“KEY-VALUE”级别的内容。这是问题的症结所在。在调用自定义序列化程序来控制值之前,已为属性写出键。
例如只有在 Jackson 系统发出密钥后才会调用我的自定义序列化程序
"fooWrapper": // now for the value part, let me invoke the custom serializer
所以输出的 JSON 总是包含“fooWrapper”键。
{ "fooWrapper": { "any-key": "any-value" } }
// the fooWrapper is already emitted out. That is what needs to be controlled.
我的要求是在更高级别控制序列化,以便可以控制键和值。所以当类 Abc 被序列化时,fooWrapper 属性根本不应该写成键,应该调用一些自定义序列化器。
另一个限制是像 Abc 这样的几个类可能有这样的 JaxBElement。不能提前知道。所以需要有一种通用的方法来附加自定义序列化程序。
伪问题实际上是我们能够将自定义序列化程序附加到具有匹配模式的属性的任何类,以便序列化程序可以控制写出的属性名称(或整个键值 blob) .
此外,该问题并非特定于 JaxBElement 本身。它可以是任何财产。问题更多是关于受控序列化,包括被写出的密钥。
【问题讨论】:
标签: java json serialization jackson