使用 Jackson 进行非对称序列化和反序列化

2024-03-23

我正在使用 Jackson 来序列化和反序列化 RESTful API 的数据。我想要一个 REST 资源(/comments),允许发布评论以及获取评论列表。

这是发布内容的(简化的)示例/comments.

{"text":"Text","author":"Paul","email":"[email protected] /cdn-cgi/l/email-protection"}

这是结果GET /comments应该看起来像:

[{"text":"Text","author":"Paul","emailHash":"76w0kjKP9HpsdhBjx895Sg=="}]

由于电子邮件地址不应该对任何人可见,因此我决定在响应中仅返回电子邮件地址的 MD5 哈希值。

我创建了一个简单的 POJO 类Comment具有带有 getter 和 setter 的字段text, author, email, and emailHash.

现在,当我序列化结果时,我得到的结果如下:

[{"text":"Text","author":"Paul","email":null,"emailHash":"76w0kjKP9HpsdhBjx895Sg=="}]

但我真的不喜欢email返回为null这里。它根本不应该被包括在内。

使用注释@JsonIgnore该字段在反序列化时也会忽略它。我是否必须创建两个类CreationComment and ResultComment具有超一流的Comment共享公共字段还是有办法避免创建额外的类?


您根本不必创建 2 个类。使用 Jackson,您可以使用注释在序列化和反序列化期间完全控制属性的行为,@JsonIgnore在 getter 中,您可以防止属性在 Json 响应中序列化并使用@JsonPropertysetter 中的注释将在反序列化期间设置属性。代码如下所示:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Comment {

    private String author;

    private String email;

    @JsonIgnore
    public String getEmail() {
        return email;
    }

    @JsonProperty
    public void setEmail(String email) {
        this.email = email;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();

        Comment comment = new Comment();
        comment.setAuthor("anAuthor");
        comment.setEmail("[email protected] /cdn-cgi/l/email-protection");

        try {
            System.out.println(objectMapper.writeValueAsString(comment));

            String json = "{\"author\":\"anAuthor\",\"email\":\"[email protected] /cdn-cgi/l/email-protection\"}";
            Comment fromJson = objectMapper.readValue(json, Comment.class);

            System.out.println("Result from Json: author= " + fromJson.getAuthor() + ", email= " + fromJson.getEmail());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

运行后的输出main()测试溶液的方法:

{"author":"anAuthor"}

Result from Json: author= anAuthor, email= [email protected] /cdn-cgi/l/email-protection

希望能帮助到你,

何塞·路易斯

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jackson 进行非对称序列化和反序列化 的相关文章

随机推荐

  • 如何使用 selenium 执行网页上的所有 javascript 内容,以在完全加载的网页上查找并发送登录表单信息

    我一直在尝试制作一个 Python 脚本来登录某个网站 浏览菜单 填写表单并将其生成的文件保存到文件夹中 我一直在使用 Selenium 尝试使网站完全加载 以便我可以找到登录的元素 但我没有成功 可能是因为网站在完全加载之前执行了大量 J
  • 自定义架构名称的宏不适用于 dbt 包

    我在 dbt 包中使用自定义架构名称时遇到问题 我使用中提供的宏数据库测试文档 https docs getdbt com docs building a dbt project building models using custom s
  • 如何使用 HQL 返回 Map

    我有一张桌子 允许 id name desc 我现在在做什么 是进行返回权限对象的查询 然后以编程方式将值放入映射中 1 但我想知道是否可以制作 HQL 如果不可能 则制作本机 sql 来选择权限ID 权限名称并将它们返回到地图中 2 是否
  • 为什么 Azure Function v2 无法绑定到 CloudTable?

    我正在尝试在 Visual Studio 2019 中运行 HTTP 触发的 v2 函数 应该是写出它的输出存储到名为 历史记录 的 Azure 存储表中 我用以下方法装饰了我的函数 return Table history 我让它返回一个
  • 无法反序列化 ActorRef 以将结果发送到不同的 Actor

    我开始使用 Spark Streaming 来处理我收到的实时数据源 我的场景是 我有一个使用 with ActorHelper 的 Akka actor 接收器 然后我让 Spark 作业执行一些映射和转换 然后我想将结果发送给另一个 a
  • 即使未移动,Motionevent Action_MOVE 仍会持续触发 X 和 Y

    我正在尝试一个简单的程序 如果移动的话 它会发出声音 所以一开始我就下了 播放声音 1 从那时起 每一个动作都会持续播放声音 在计数 4 时 我已经从头开始播放了 问题是 当我不移动手指并将其放在同一个地方时 声音仍然保持 1 x 1 计算
  • 有没有办法自动将Matlab 中的结果或数据导入到Mathematica 中?

    有没有办法将结果或数据 例如矩阵 从Matlab导入到Mathematica自动地 或者有什么方法可以先运行Matlab程序 然后运行Mathematica程序自动地 感谢您提供任何有用的答案 至少有三种方法可以解决这个问题 通过 Java
  • Actors 中 future 的执行上下文

    我有一个 Actor 并且在某些消息上我正在运行一些返回 Future 的方法 def receive Receive case SimpleMessge gt val futData Future Int futData map data
  • json_encode 输出对象而不是某些元素的数组

    我有这个数组 我想将其编码为 json Array 0 gt Array 0 gt Hour 1 gt bteam pvp 2 gt crackpack 3 gt tppi 4 gt agrarian plus 5 gt agrarian2
  • protobuf 取出部分数据的安全性如何?

    在没有任何加密的情况下 如果接收者拥有序列化的 Protobuf 文件 但没有生成的 Protobuf 类 他们无权访问定义其结构的 proto 文件 他们是否有可能获取 Protobuf 中的任何数据来自二进制文件 如果他们有权访问 pr
  • CFBundleVersion 必须高于以前的版本

    我正在提交我的一个应用程序的更新 我已经用我开发的许多不同的应用程序完成了数十次这样的操作 但是这个应用程序由于某种奇怪的原因而失败了 我存档我的应 用程序 然后尝试验证存档并收到以下错误消息 该捆绑包无效 Info plist 文件中的关
  • 在 python 中生成非子进程

    我需要在 python 中创建一个进程 允许调用进程在子进程仍在运行时退出 什么是有效的方法来做到这一点 注意 我在 UNIX 环境上运行 在类 Unix 操作系统中 终止父进程不会终止子进程 因此您不需要执行任何特殊操作 只需启动你的子流
  • React'findNodeHandle 方法停止工作

    升级到后0 26 0 rc版本 这一行 React findNodeHandle this refs myRef 抛出此错误消息 未处理的 JS 异常 react2 default findNodeHandle 不是 功能 我用这个导入 R
  • 在父类中访问子类变量

    在父类中访问子类的变量是否正确 这是一种好的 OOP 方法吗 我不需要创建 Animal 类的实例 但如果我愿意的话 make sound方法会提高AttributeError 这让我很困扰 class Animal def make so
  • Spring Boot thymeleaf 图像

    我正在尝试开发用于发送电子邮件的 Spring Boot 应用程序 一切都很好 但是在模板 thymeleaf 中 当我尝试添加图像时 它显示错误 这是我的 template html 的一个片段 div h2 title h2 div
  • 以当前区域设置和货币设置价格格式

    I use product gt getPrice 获得未格式化的价格 我可以用ajax计算 数量X价格 我想以当前区域设置和货币重新格式化总计 我怎样才能做到这一点 我认为谷歌可以回答你的问题 看看http blog chapagain
  • 如何找到 numpy 数组列中的最大值?

    我可以找到这个问题的很多排列 但不是这个 相当简单 如何找到 numpy 数组的特定列的最大值 以最Pythonic的方式 a array 10 2 3 4 5 6 我想要的是第一列和第二列中的最大值 这些是x y坐标 我最终需要每个形状的
  • 滚动连接:向前和向后滚动

    data table太棒了 因为我可以做滚动连接 甚至可以做滚动连接组内 library data table set seed 42 metrics lt data frame ID c rep 1 10 rep 2 5 rep 3 5
  • 使用自定义对象建议创建 GWT SuggestOracle

    我正在尝试将下拉框小部件转换为 SuggestionBox 因为当前的下拉菜单有 100 多个选项 不过 您似乎只能将字符串建议添加到 SuggestOracle 中 我需要能够添加一个自定义对象 其中包含与数据库中的记录匹配的描述和 ID
  • 使用 Jackson 进行非对称序列化和反序列化

    我正在使用 Jackson 来序列化和反序列化 RESTful API 的数据 我想要一个 REST 资源 comments 允许发布评论以及获取评论列表 这是发布内容的 简化的 示例 comments text Text author P