java – Jackson序列化的动态属性名称
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Jackson序列化的动态属性名称,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2825字,纯文字阅读大概需要5分钟。
内容图文
![java – Jackson序列化的动态属性名称](/upload/InfoBanner/zyjiaocheng/733/1a7041d6944b4a7787cd6e8afa79e818.jpg)
我有很多类,我正在尝试序列化为JSON.它们非常相似,所以我想知道是否有更好的方法来执行此操作,而不是每次出现此模式时创建3个非常接近相同的类:
public class SomethingFoo {
@JsonProperty("foo")
Identifier foo
// other properties
}
public class SomethingBar {
@JsonProperty("bar")
Identifier bar
// other properties
}
public class SomethingBaz {
@JsonProperty("baz")
Identifier baz
// other properties
}
标识符是一个只包含一个字段的类:
public class Identifier {
@JsonProperty("name")
String name = "";
}
我想做的是将标识符更改为:
public class Identifier {
@JsonProperty("name")
String name = "";
@JsonIgnore
IdentifierType type;
}
public Enum IdentifierType {
FOO, BAR, BAZ;
}
然后,我想使用Identifier中的’type’字段来更改包含这些Identifier的对象中Identifier字段的名称.
我想用这个替换SomethingFoo,SomethingBar和SomethingBaz:
public class Something {
@JsonProperty(??????)
Identifier name
// other properties
}
我希望Something.identifier的属性名称为“foo”,“bar”或“baz”,具体取决于Identifier.type的值.
或者,我也可以使用标识符进行子类化,而不是使用枚举.
问题是我正在尝试使用对象中的值(或对象的类型,如果使用子类)来通知Identifier的包含类中的属性名称.所以我不知道在不改变包含标识符的每个类的情况下,我想做什么是可能的.
编辑:
问题是我希望将“Something”序列化为其中之一(基于Identifier的枚举类型(或子类,如果这是实现此目的的更好方法)):
{
"foo" : {
"name" : "blahblahblah"
}
}
{
"bar" : {
"name" : "blahblahblah"
}
}
{
"baz" : {
"name" : "blahblahblah"
}
}
解决方法:
注释的属性值必须是常量,因此您无法更改它.我不确定我在这里看到了什么问题.为什么下面的解决方案不起作用? @JsonProperty只是告诉ObjectMapper Json字段的名称应该是什么.
public class Something {
@JsonProperty(value = "id")
Identifier identifier
// other properties
}
如果您序列化了其中一个对象,那么它将会出现这样的情况:
{
"id": FOO,
...
}
如果没有@JsonProperty的值 – “id”,它只会使用字段名称:
{
"identifier": FOO,
...
}
杰克逊有很多方法可以自定义序列化和反序列化对象.如果您希望序列化有更多信息(例如,如果您向Enum添加任何字段)或想要更改它的序列化方式,那么有办法做到这一点.例如,如果您希望将Enum序列化为对象在杰克逊2.1.2 @JsonFormat你可以这样做:
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Identifier {...}
编辑:
我不认为将数据序列化为上述格式必然是有意义的,因为您不再将对象表示为JSON,因为您将其表示为不同的对象.您已经在对象上有一个字段,用于区分该对象的标识符,并且您可以在其他任何位置使用该字段.如果你真的想按照上面描述的方式将数据序列化,我相信你必须为这种类型实现自己的JsonSerializer(至少对于Jackson 2.1):
public SomethingSerializer extends JsonSerializer<Something> {
// Define serialization methods
...
}
然后扩展SimpleModule,添加序列化程序,并使用ObjectMapper注册模块:
ObjectMapper mapper = new ObjectMapper();
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null));
testModule.addSerializer(new SomethingSerializer());
mapper.registerModule(testModule);
例子改编自JacksonHowToCustomSerializers
内容总结
以上是互联网集市为您收集整理的java – Jackson序列化的动态属性名称全部内容,希望文章能够帮你解决java – Jackson序列化的动态属性名称所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。