我正在使用 Java 与 Spring MVC 和 MyBatis 连接到数据库。我有一个帐户表,对于某些查询,我需要所有字段,但对于其他查询,我只需要一些属性。
比如用MyBatis查询后显示账户的基本信息,一些我没有指定的字段返回为null
,false
甚至是0
。最初这是我的 ResponseBody:
{
"accountName": "pagos.com",
"country": "CO",
"commercialName": "pagaTu",
"city": "Chiquinquirá",
"location": null,
"secureName": null,
"description": null,
"document": "1101097231",
"localOperation": false,
"address": null,
"acceptInternationalTransactions": false,
"balance": 0
}
因此,我使用以下注释来避免具有空值的字段:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Account implements Serializable {...}
目前我的 ResponseBody 删除这样的空值:
{
"accountName": "pagos.com",
"country": "CO",
"commercialName": "pagaTu",
"city": "Chiquinquirá",
"document": "1101097231",
"localOperation": false,
"acceptInternationalTransactions": false,
"balance": 0
}
但由于我也不需要查询中的最后 3 个字段,因此返回这些字段false
和0
. 另一种方法是创建一个仅包含我需要的字段的模型。但首先我想知道是否有另一种解决方案,可能在生成 ResponseBody 时删除这些字段。
预期的响应是:
{
"accountName": "pagos.com",
"country": "CO",
"commercialName": "pagaTu",
"city": "Chiquinquirá",
"document": "1101097231"
}
如果您确定这些字段永远不会被导航,最舒服的事情是在您不想被序列化的 getter 上使用 @JsonIgnore。
从 Jackson 2.6 版开始,您可以在要反序列化的属性上使用 com.fasterxml.jackson.annotation.JsonProperty。
例如:
私有字符串属性XXX;
javadoc 文档指出了这种类型的访问:
为避免创建 DTO,您可以停止在实体中使用原始数据类型并改用包装器:
这样一来,这些字段的默认值就不再是
false
两者了,因为0
它们null
是对象。如果您担心此更改的内存开销,我会告诉您,除非您正在处理存储在内存中的大量数据(我想这些项目中有 100k 在内存中),否则它真的不是很大同时,至少)。