在 jackson mixins 中同时使用 @JsonIgnore 和 @JsonProperty 的问题
Issue with using both @JsonIgnore and @JsonProperty in jackson mixins
我有一个在 jackson mixin 中同时使用 @JsonIgnore
和 @JsonProperty
的用例。
这是我的混音:
public abstract class MessageMixin {
@JsonIgnore
Member sender;
@JsonIgnore
Member recipient;
@JsonProperty("senderId")
Long getSenderId() {
return sender.getId();
}
@JsonProperty("recipientId")
Long getRecipientId() {
return recipient.getId();
}
@JsonProperty("senderFirstName")
String getSenderFirstName() {
return sender.getFirstName();
}
@JsonProperty("recipientFirstName")
String getRecipientFirstName() {
return recipient.getFirstName();
}
}
sender
和 recipient
字段被正确忽略,但添加了 @JsonProperty
字段的 none。
有人可以帮忙吗?
Mix-ins 可用于将 Jackson 配置应用于 classes 而无需修改目标 class 的源代码。 Mix-ins 可以被认为是位于 class 之上的配置层,Jackson 将在 de/serialization 期间查看指令。 Mix-ins 的一个好处是它们将 Jackson 特定的配置与您的项目代码分离,使您可以摆脱 Jackson 并使用新框架而无需修改所有 VO。话虽这么说,为了实例化的目的扩展一个混入是很奇怪的。我认为您会希望在混合中避免像 sender.getFirstName()
这样的逻辑,并允许基数 class 填充值。例如,对于您提供的混入,我希望基础 class 具有 public sender
和 recipient
成员,并且您的混入完全是抽象的。
如果Message
是一个已经存在的class
假设基数 class 是这样的:
public class Message {
public Member sender;
public Member recipient;
public Message(Member sender, Member recipient) {
this.sender = sender;
this.recipient = recipient;
}
public Long getSenderId() {
return sender.getId();
}
public Long getRecipientId() {
return recipient.getId();
}
public String getSenderFirstName() {
return sender.getFirstName();
}
public String getRecipientFirstName() {
return recipient.getFirstName();
}
}
如果没有混合,这个 class 会产生:
{
"sender": {
"id": 883,
"firstName": "Bob"
},
"recipient": {
"id": 3993,
"firstName": "Jilly"
},
"senderId": 883,
"recipientId": 3993,
"senderFirstName": "Bob",
"recipientFirstName": "Jilly"
}
要引入混入并忽略 sender
和 recipient
而不修改 Message
,必须使用 ObjectMapper
.[=27 注册混入=]
混音可能如下所示:
public abstract class MessageMixin {
@JsonIgnore
Member sender;
@JsonIgnore
Member recipient;
@JsonProperty("senderId")
abstract Long getSenderId();
@JsonProperty("recipientId")
abstract Long getRecipientId();
@JsonProperty("senderFirstName")
abstract String getSenderFirstName();
@JsonProperty("recipientFirstName")
abstract String getRecipientFirstName();
}
ObjectMapper
配置如下:
ObjectMapper om = new ObjectMapper()
.addMixIn(Message.class, MessageMixin.class);
它会输出以下内容 JSON:
{
"senderId": 883,
"senderFirstName": "Bob",
"recipientFirstName": "Jilly",
"recipientId": 3993
}
如果Message
不存在
如果 Message
基础 class 不存在,那么您最好创建一个简单的 POJO 来完成 "Message" 表示。像这样的东西可以很好地处理序列化和反序列化。
public class MessagePojo {
private final Member sender;
private final Member recipient;
@JsonCreator
public MessagePojo(@JsonProperty("sender") Member sender,
@JsonProperty("recipient") Member recipient) {
this.sender = sender;
this.recipient = recipient;
}
@JsonProperty("senderId")
public Long getSenderId() {
return sender.getId();
}
@JsonProperty("recipientId")
public Long getRecipientId() {
return recipient.getId();
}
@JsonProperty("senderFirstName")
public String getSenderFirstName() {
return sender.getFirstName();
}
@JsonProperty("recipientFirstName")
public String getRecipientFirstName() {
return recipient.getFirstName();
}
}
我有一个在 jackson mixin 中同时使用 @JsonIgnore
和 @JsonProperty
的用例。
这是我的混音:
public abstract class MessageMixin {
@JsonIgnore
Member sender;
@JsonIgnore
Member recipient;
@JsonProperty("senderId")
Long getSenderId() {
return sender.getId();
}
@JsonProperty("recipientId")
Long getRecipientId() {
return recipient.getId();
}
@JsonProperty("senderFirstName")
String getSenderFirstName() {
return sender.getFirstName();
}
@JsonProperty("recipientFirstName")
String getRecipientFirstName() {
return recipient.getFirstName();
}
}
sender
和 recipient
字段被正确忽略,但添加了 @JsonProperty
字段的 none。
有人可以帮忙吗?
Mix-ins 可用于将 Jackson 配置应用于 classes 而无需修改目标 class 的源代码。 Mix-ins 可以被认为是位于 class 之上的配置层,Jackson 将在 de/serialization 期间查看指令。 Mix-ins 的一个好处是它们将 Jackson 特定的配置与您的项目代码分离,使您可以摆脱 Jackson 并使用新框架而无需修改所有 VO。话虽这么说,为了实例化的目的扩展一个混入是很奇怪的。我认为您会希望在混合中避免像 sender.getFirstName()
这样的逻辑,并允许基数 class 填充值。例如,对于您提供的混入,我希望基础 class 具有 public sender
和 recipient
成员,并且您的混入完全是抽象的。
如果Message
是一个已经存在的class
假设基数 class 是这样的:
public class Message {
public Member sender;
public Member recipient;
public Message(Member sender, Member recipient) {
this.sender = sender;
this.recipient = recipient;
}
public Long getSenderId() {
return sender.getId();
}
public Long getRecipientId() {
return recipient.getId();
}
public String getSenderFirstName() {
return sender.getFirstName();
}
public String getRecipientFirstName() {
return recipient.getFirstName();
}
}
如果没有混合,这个 class 会产生:
{
"sender": {
"id": 883,
"firstName": "Bob"
},
"recipient": {
"id": 3993,
"firstName": "Jilly"
},
"senderId": 883,
"recipientId": 3993,
"senderFirstName": "Bob",
"recipientFirstName": "Jilly"
}
要引入混入并忽略 sender
和 recipient
而不修改 Message
,必须使用 ObjectMapper
.[=27 注册混入=]
混音可能如下所示:
public abstract class MessageMixin {
@JsonIgnore
Member sender;
@JsonIgnore
Member recipient;
@JsonProperty("senderId")
abstract Long getSenderId();
@JsonProperty("recipientId")
abstract Long getRecipientId();
@JsonProperty("senderFirstName")
abstract String getSenderFirstName();
@JsonProperty("recipientFirstName")
abstract String getRecipientFirstName();
}
ObjectMapper
配置如下:
ObjectMapper om = new ObjectMapper()
.addMixIn(Message.class, MessageMixin.class);
它会输出以下内容 JSON:
{
"senderId": 883,
"senderFirstName": "Bob",
"recipientFirstName": "Jilly",
"recipientId": 3993
}
如果Message
不存在
如果 Message
基础 class 不存在,那么您最好创建一个简单的 POJO 来完成 "Message" 表示。像这样的东西可以很好地处理序列化和反序列化。
public class MessagePojo {
private final Member sender;
private final Member recipient;
@JsonCreator
public MessagePojo(@JsonProperty("sender") Member sender,
@JsonProperty("recipient") Member recipient) {
this.sender = sender;
this.recipient = recipient;
}
@JsonProperty("senderId")
public Long getSenderId() {
return sender.getId();
}
@JsonProperty("recipientId")
public Long getRecipientId() {
return recipient.getId();
}
@JsonProperty("senderFirstName")
public String getSenderFirstName() {
return sender.getFirstName();
}
@JsonProperty("recipientFirstName")
public String getRecipientFirstName() {
return recipient.getFirstName();
}
}