当前位置: 首页 > 编程笔记 >

Java开发中POJO和JSON互转时如何忽略隐藏字段的问题

柏高洁
2023-03-14
本文向大家介绍Java开发中POJO和JSON互转时如何忽略隐藏字段的问题,包括了Java开发中POJO和JSON互转时如何忽略隐藏字段的问题的使用技巧和注意事项,需要的朋友参考一下

1. 前言

在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道。通常情况下我们会将其设置为null或者空字符 "",其实还有其它办法,如果你使用了Jackson的话。接下来我将以一个实际场景来告诉你可以怎么做。

2. Jackson如何忽略字段

这里都以JSON序列化为例。假如我们在业务中需要返回用户信息,已有的POJO是这样的:

import lombok.Data;

/**
 * @author felord.cn
 */
@Data
public class UserInfo {
  /**
   * userid
   */
  private String userId;
  /**
   * 用户名
   */
  private String username;
  /**
   * 密钥串
   */
  private String secret;
  /**
   * 地址信息
   */
  private String address;
}

业务场景:第三方通过用户的userId来获取用户的信息,但是密钥串secret显然不能让第三方知道,通常最容易想到的方法是将secret字段设置为null或者""。如果业务需要批量提供用户信息,即List<UserInfo>,我们总不能每次都要遍历一遍吧。Spring Boot内置的Jackson可以很方便的帮我们处理这个问题。

使用@JsonIgnore注解

Jackson提供了一个@JsonIgnore注解,将它标记到需要被忽略的字段上或者对应的getter方法或者setter方法上就可以实现对该字段的屏蔽。就像下面这样标记:

  @JsonIgnore
  private String secret;
  // 对应json 样例 {"userId":"100000","username":"felord.cn","address":"cn"}

无论是序列化(将POJO转为JSON)还是反序列化((将JSON转为POJO),secret都会被忽略。

使用@JsonIgnoreProperties注解

这个注解比@JsonIgnore更加强大一些,通常该注解标记到POJO之上,它有更多的能力:

  • 忽略多个字段,配置value属性即可。
  • 忽略未知的属性,配置ignoreUnknown为true,默认不忽略。
  • 允许忽略字段被序列化,配置allowGetters为true,序列化的时候不会被忽略。
  • 允许忽略字段被反序列化,配置allowSetters为true,反序列化的时候不会被忽略。

例如我们要忽略UserInfo中的secret和address,我们可以这样配置:

@JsonIgnoreProperties({"secret", "address"})

使用@JsonProperty注解

需要Jackson版本不低于2.6

这个注解出镜率还是非常高的,通常为了给JSON的字段起别名或者设置默认值使用。比如UserInfo中的userId想对应JSON中的user_id,我们可以:

@JsonProperty(value = "user_id")
private String userId;

在2.6版本以后,这个注解也能实现忽略字段的作用。它有个access属性,用来指定在序列化(“读取”)和反序列化(“写”)期间访问权限(这里的读写是以属性为视角)。它由枚举Access定义:

public enum Access
{
  /**
   * 无论是序列化还是反序列化都会根据配置自动的处理,默认值。
   */
  AUTO,

  /**
   * 意味着该属性只能在进行序列化时读取(通过“ getter”方法访问的值,或者从字段中读取),而在反序列化   * 期间不能写入(设置)。换句话说,这将反映“只读POJO”,其中包含的值可以读取但不能写入。
   */
  READ_ONLY,

  /**
   * 意味着该属性只能作为反序列化的一部分写入(设置)(使用“ setter”方法,或分配给Field,或作为     * Creator参数传递),而不会被读取(获取)以进行序列化,即,该属性的值不包括在序列化中。
   */
  WRITE_ONLY,

  /**
   * 可读可写,READ_ONLY与WRITE_ONLY的合并效果。
   */
  READ_WRITE;
}

从这个注解中我们可以知道,如果你想在POJO转JSON时忽略secret字段,就可以这么写:

@JsonProperty( access = JsonProperty.Access.WRITE_ONLY)
private String secret;

使用@JsonIgnoreType注解

这个注解是用来直接忽略类型的,如果上面的UserInfo是另外一个POJO的属性,我们不希望它被序列化和反序列化,那么就可以:

@JsonIgnoreType
public class UserInfo {
  // 省略
}

3. 总结

目前大概可知的Jackson有这么四种的忽略属性的方式,它们有各自的使用场景,你可以根据自己的情况选择使用。

到此这篇关于Java开发中POJO和JSON互转时如何忽略隐藏字段的问题的文章就介绍到这了,更多相关Java中POJO和JSON互转内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题内容: 在以下情况下: 学生“隐藏人的ID字段。 如果我们想在内存中表示以下内容: 约翰对象会为storint Person.ID及其自己拥有两个单独的存储位置吗? 问题答案: 正确。示例中的每个类都有其自己的int IDid字段。 您可以通过以下方式从子类中读取或分配值: 或在外部(当它们是公开的时):

  • 我想从我的响应中排除name和age,但是当我收到JSON有效载荷请求时,我需要name和age字段-在我的业务逻辑之后,我想发送状态和消息作为JSON响应的一部分。姓名和年龄应该排除在外。我如何在Java中实现这一点? 我的控制器类:

  • 问题内容: 我正在使用RestEasy并hibernate以返回Jackson的响应。我有一个bean播放器,具有以下字段:名称,id,年龄,位置。 现在,我正在实现两种重现json的rest方法。 ,这将返回一名玩家:姓名,身份证,年龄,位置。 ,这将返回玩家列表,但是有了这个玩家列表,我不想返回位置。 我的意思是,我该如何为一个响应添加一个字段,而对另一个响应忽略它。 请提出建议。 谢谢 问题

  • 问题内容: 我的python脚本执行一个路径,其中路径是一个队列,其中包含我需要一个一个对待的档案。 问题是我将列表放入数组中,然后执行一个简单的。直到我将项目置于颠覆状态之前,一切都很好。现在,我将文件夹保存在数组中,这当然会使我的应用程序崩溃。 所以这是我的问题:是否有一个函数在执行时会忽略隐藏文件,如果不是,那是最好的方法? 问题答案: 您可以自己写一个: 或者您可以使用glob: 这些文件

  • 问题内容: 当我发送此请求时: 我的休息服务: 我期望得到一个例外,因为: 我的域模型中没有invalidField。 日期格式无效。 但是实际上我得到的测试对象具有空值。我的dmain模型是: 我认为这不是有效的行为。我该如何解决? 感谢帮助。 解: 正如Blaise Doughan所说,需要扩展MOXy的MOXyJsonProvider并重写preReadFrom方法以设置自定义javax.x

  • 我有这个代码,可以获取股票价格。所有股票符号都在一个表列表中,现在如果该符号不在观察列表中,其行将被隐藏。我现在面临的挑战或我想要实现的是忽略这些隐藏的行来获取其股价。我只是想让代码忽略它。提前谢谢你的帮助。 当前结果是这样的(那些在观察列表中为“否”的是隐藏行,但代码仍然返回其价格): 行符号价格观察列表(过滤器) 1 ABS 17是的 2 BDO 19号 3 NIKL 4是的 4技术5号 5