如何向 Jackson 全局添加自定义序列化器并默认使用

2024-03-18

假设我想序列化Boolean into Number 默认情况下.

我知道我可以逐个领域地做到

@JsonFormat(shape = Shape.NUMBER)
private Boolean success;

但是我可以“注册”我的自定义序列化器,以便当我从 API 返回对象时,Boolean类中的 s 将被序列化为Number在 json 响应中。

我有以下序列化器

public class MyBooleanSerializer extends JsonSerializer<Boolean> {
    @Override
    public void serialize(
                    Boolean value, 
                    JsonGenerator gen, 
                    SerializerProvider serializers) throws IOException {

        gen.writeString(value ? "1" : "0");

    }
}

我有以下课程

@Data
public class MyResponse {
    private Boolean success;
    private String message;
}

它将像这样使用

@GetMapping("/hello")
public MyResponse hello() {
    Boolean success = true;
    String message = "Hi there";
    return new MyResponse(success, message);
}

当我GET这个 API,我期待这个响应

{
  success: 1,
  message: "Hi there"
}

我期待注入一些 Bean。我努力了

@Bean
@Primary
ObjectMapper objectMapper() {
    SimpleModule module = new SimpleModule();
    module.addSerializer(new MyBooleanSerializer());
    return new ObjectMapper()
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
            .registerModule(module);
}

但它不起作用。

我读过了this https://howtodoinjava.com/jackson/jackson-booleans/教程,似乎需要创建jsonMapper每次我想序列化一个对象时。我想要的只是每当我回来的时候MyResponse从 API 中,Booleans 被序列化为Numbers.


不需要全局序列化器

,只是为了执行@JsonFormat(shape = Shape.NUMBER)布尔字段的全局注释。

您只需覆盖适用于布尔字段的全局规则即可使用您的自定义之一Shape.NUMBER这样您就不必在每个类的每个布尔字段中都执行此操作。

所以而不是有serialization/deserialization在每个班级的每个领域

@JsonFormat(shape = Shape.NUMBER)
private Boolean success;

您可以在全局范围内使用以下代码来完成此操作:

@Bean
public ObjectMapper registerObjectMapper(){
   ObjectMapper mapper = new ObjectMapper();            
   mapper.configOverride(Boolean.class)
         .setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.NUMBER));
   mapper.configOverride(boolean.class)
         .setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.NUMBER));
   return mapper;
 }

如果有必要,如何应用全局序列化器

但是,如果您坚持注册全局序列化器,以便该格式仅用于序列化而不是反序列化,那么您可以这样做:

@Bean
public ObjectMapper registerObjectMapper(){
    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule("MyBooleanSerializer");
    module.addSerializer(Boolean.class, new MyBooleanSerializer());
    module.addSerializer(boolean.class, new MyBooleanSerializer());
    mapper.registerModule(module);
   
    return mapper;
}

And

public class MyBooleanSerializer extends JsonSerializer<Boolean> {
    @Override
    public void serialize(
                    Boolean value, 
                    JsonGenerator gen, 
                    SerializerProvider serializers) throws IOException {

        gen.writeString(value ? "1" : "0");

    }
}

有一个问题

仔细看看第二个解决方案

module.addSerializer(Boolean.class, new MyBooleanSerializer());
module.addSerializer(boolean.class, new MyBooleanSerializer());

在第一个解决方案中

  .configOverride(Boolean.class)
  .configOverride(boolean.class)

For Jackson原始的boolean作为字段和包装器Boolean类需要单独注册才能工作。

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

如何向 Jackson 全局添加自定义序列化器并默认使用 的相关文章

随机推荐

  • 在node.js中,全局对象(或头对象)有名称吗?

    如果环境是浏览器 那么我们可以使用 测试this关键字指向window对象 也是全局对象 或者有些书称其为 头对象 如果在node js中 有没有类似这样的名字呢 window 以便 console log this globalObjec
  • 确定线斜率变化的位置(算法)

    如果你绘制下面的数字 你会得到一个 波动性微笑 数字遵循一个线性斜率 左斜率 然后更改为 遵循另一个线性斜率 右斜率 我有几组这样的数据 想知道斜率在哪里 变化 笔记 斜率变化通常发生在点之间 不知道有多少个点有左斜率 有多少个有 正确的斜
  • java 如何打开另一个目录中的文件?

    如何打开不在当前目录中但在另一个目录中的文件 例如 我有一个文件夹 F test 我的文件位于 F test test2 doit txt 和 D test3 doit2 txt 创建文件对象时在参数路径中输入的内容如下 File f ne
  • XSLT - 将前同级元素与当前节点元素进行比较

    我有这个 XML 文件
  • JavaFX 如何滚动 ScrollPane 以使节点位于视口中间?

    我必须创建显示当前时间的时间线 我正在使用 AnchorPane 并将添加的行放置在 ScrollPane 中 我需要模拟1天 滚动窗格宽度为 2880px 每60px为一小时 我的限制是 前一天 12 小时 第二天 12 小时 移动我的线
  • 如何为BackgroundService传递参数?

    我阅读了有关 ASP net core 2 2 的内容 并找到了有关通用主机的参考资料 我尝试在示例下使用 backgroundService 创建控制台应用程序 https github com aspnet AspNetCore Doc
  • 一个值在数组中存在多少次[重复]

    这个问题在这里已经有答案了 我想做的第一件事是找出我在输入中输入的数字是否存在于数组中 这有效 我想做的第二件事是找出它存在的次数 我在这里走的路正确吗
  • 如何将 Flot 与 AngularJS 集成?

    我对 Angular 和 Flot 很陌生 但对 Jquery 和 Javascript 很熟悉 我对如何将 Flot 图表绑定到 Angular 数据模型有点困惑 因为 Flot 是一个 JQuery 插件 我四处搜寻 但未能找到示例 我
  • 库存管理数据库设计

    我正在为我的公司创建一个内部网 我们希望在其中进行库存管理 我们销售和租赁报警系统 我们希望很好地了解哪些产品仍在我们的办公室中 哪些产品已出租或出售 何时出租或出售等 目前我想到了这个数据库设计 每次我们创建新合同时 该合同都与地点或商品
  • 如何扩展Generator类?

    我尝试过滤生成器 并期望这种通用功能必须在 JavaScript 中的任何位置定义 因为它是为数组定义的 但我找不到它 所以我试图定义它 但我无法扩展内置发电机 我有一个示例生成器 function make nums let nums n
  • NSFetchRequest 未捕获属性已更改的对象

    我在 Mac Os X 10 6 上使用 SQL 存储时遇到了 Core Data 的奇怪问题 我有一个NSManagedObject子类称为Family有属性name和一段关系personList连接到另一个NSManagedObject
  • 必须从 UI 线程调用 getText() 方法

    必须从 UI 线程调用 getText 方法 请帮忙 我是 android studio 的初学者 在网上找到了这些代码 但无法弄清楚 我真的很感激 public class MainActivity extends AppCompatAc
  • Django password_reset 支持 html 电子邮件模板吗?

    在我看来 django 仅支持开箱即用的密码重置电子邮件的纯文本消息 我如何使用 html 模板来实现此目的 以下是如何进行覆盖 urls py url r user password reset YOUR APP views passwo
  • node.js - 代码保护?

    我想在下一个项目中使用node js 但我的老板不喜欢我们的竞争对手可以阅读源代码 有没有办法保护 JavaScript 代码 您可以使用 Node 的 NativeExtension 来完成此操作 你会有一个boostrap js为 js
  • 我如何能够在 C++ 中声明一个在运行时确定的可变长度数组?

    请检查这段代码 它编译并运行得非常好 问题是 当我开始学习 c turbo c 时 我从来无法将任何类型的数组声明为 datatype var variable set at runtime 我想当然地认为这在最新的 gcc 编译器中是不可
  • 如何根据优先级和关联性来解析(复杂)声明?

    符号 如 等 两者都使用表达式 and 声明 这是两个不同的概念 In 表达式 符号为运营商 为此我们有一个明确定义的优先级和结合性表 当表达比较复杂 我们可以利用这张表进行分解分析 例如 a b c Question In 声明 这些符号
  • 使用 Kinesis Analytics 构建实时会话

    是否有某个地方的示例 或者有人可以解释如何使用 Kinesis Analytics 构建实时会话 即会话化 这里提到这可能 https aws amazon com blogs aws amazon kinesis analytics pr
  • Oracle XMLQuery 正在破坏命名空间

    甲骨文版本11 2 下面是我在 XMLType 列上运行的 XMLQuery 的简化版本 当我运行查询时 它只是解析并重新创建存储的 XML tsxm 命名空间 不等于默认命名空间 被改变 该查询不执行任何操作 并且可以轻松重写 但真正的
  • 如何在 pandas df.query() 中使用循环变量

    我该如何解决以下问题df query行停止获取错误消息 name z is not defined 我有 3 列数据 想要绘制 3D 多边形 我运行一个循环来配对 X Y 其中我尝试使用循环变量 z 筛选一列 zs 20 30 40 50
  • 如何向 Jackson 全局添加自定义序列化器并默认使用

    假设我想序列化Boolean into Number 默认情况下 我知道我可以逐个领域地做到 JsonFormat shape Shape NUMBER private Boolean success 但是我可以 注册 我的自定义序列化器