Jackson databind 枚举不区分大小写

2023-11-21

如何反序列化包含不区分大小写的枚举值的 JSON 字符串? (使用杰克逊数据绑定)

JSON 字符串:

[{"url": "foo", "type": "json"}]

和我的 Java POJO:

public static class Endpoint {

    public enum DataType {
        JSON, HTML
    }

    public String url;
    public DataType type;

    public Endpoint() {

    }

}

在这种情况下,反序列化 JSON"type":"json"会失败,因为"type":"JSON"会工作。 但我想要"json"出于命名约定的原因也可以工作。

序列化 POJO 也会导致大写"type":"JSON"

我想用@JsonCreator和@JsonGetter:

    @JsonCreator
    private Endpoint(@JsonProperty("name") String url, @JsonProperty("type") String type) {
        this.url = url;
        this.type = DataType.valueOf(type.toUpperCase());
    }

    //....
    @JsonGetter
    private String getType() {
        return type.name().toLowerCase();
    }

它奏效了。但我想知道是否有更好的解决方案,因为这对我来说看起来像是一个黑客。

我还可以编写一个自定义反序列化器,但我有许多不同的 POJO 使用枚举,并且很难维护。

任何人都可以建议一种更好的方法来使用正确的命名约定来序列化和反序列化枚举吗?

我不希望 java 中的枚举是小写的!

这是我使用的一些测试代码:

    String data = "[{\"url\":\"foo\", \"type\":\"json\"}]";
    Endpoint[] arr = new ObjectMapper().readValue(data, Endpoint[].class);
        System.out.println("POJO[]->" + Arrays.toString(arr));
        System.out.println("JSON ->" + new ObjectMapper().writeValueAsString(arr));

杰克逊2.9

现在这很简单,使用jackson-databind2.9.0及以上版本

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS);

// objectMapper now deserializes enums in a case-insensitive manner

带测试的完整示例

import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

  private enum TestEnum { ONE }
  private static class TestObject { public TestEnum testEnum; }

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

    try {
      TestObject uppercase = 
        objectMapper.readValue("{ \"testEnum\": \"ONE\" }", TestObject.class);
      TestObject lowercase = 
        objectMapper.readValue("{ \"testEnum\": \"one\" }", TestObject.class);
      TestObject mixedcase = 
        objectMapper.readValue("{ \"testEnum\": \"oNe\" }", TestObject.class);

      if (uppercase.testEnum != TestEnum.ONE) throw new Exception("cannot deserialize uppercase value");
      if (lowercase.testEnum != TestEnum.ONE) throw new Exception("cannot deserialize lowercase value");
      if (mixedcase.testEnum != TestEnum.ONE) throw new Exception("cannot deserialize mixedcase value");

      System.out.println("Success: all deserializations worked");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jackson databind 枚举不区分大小写 的相关文章

  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • try-with-resources 中出现死代码警告,但翻译后的 try-catch-finally 中没有出现死代码警告

    以下代码使用try 有资源 https docs oracle com javase specs jls se7 html jls 14 html jls 14 20 3Java 8 中引入的构造 偶尔抛出 方法被声明为抛出一个偶尔的异常
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发

随机推荐

  • 如何在不重新启动服务器的情况下停止 Jenkins 上不可阻挡的僵尸作业?

    我们的 Jenkins 服务器有一个作业已经运行了三天 但没有做任何事情 单击角落里的小 X 不会执行任何操作 控制台输出日志也不会显示任何内容 我检查了我们的构建服务器 该作业实际上似乎根本没有运行 有没有办法通过编辑某些文件或锁定或其他
  • ASP.NET 中的两种方式数据绑定

    假设我们有一个对象 class Entity public string ID get set public string Name get set 我想将属性绑定到页面上的两个文本框 如下所示
  • pandas concat 用 NaN 填充非对齐索引

    Problem 我连接了两个 int 类型系列 而我返回的数据帧是 float 类型 发生这种情况是因为该系列的索引未对齐 并且当发生串联时 pandas 用 NaN 填充空白 然而 NaN 被认为是浮点数 不幸的是 我的所有整数都随之转换
  • Java Forkjoin 与 ExecutorService - 何时使用哪个?

    我刚刚读完这篇文章 Java 5 ThreadPoolExecutor 相对于 Java 7 ForkJoinPool 有什么优势 并觉得答案不够直接 你能用简单的语言和例子解释一下 什么是权衡Java 7 的 Fork Join 框架和旧
  • 仅限 jQuery 和 ReactJS 动画

    我只需要使用 jQuery 动画 请不要提及过渡 这是我的代码库 var CommentForm React createClass componentWillUnmount function cb console log hiding j
  • 删除表的存储过程

    我创建了一个存储过程 如果数据库中存在表 它将删除该表 当使用 EXEC 运行存储过程时 出现以下错误 消息 203 级别 16 状态 2 程序 sp DropIfExists 第 13 行 名称 IF 存在 从 sys objects 中
  • MySQL 视图的替代结构。它是什么?

    我们一直在使用 phpmyadmin 4 导出数据库 数据库包含一些视图 并且在通常的 CREATE VIEW 命令之前 有一个带有注释 视图 viewName 的替代结构 的 CREATE TABLE 命令 为什么使用这种替代结构 注意
  • 在最新的 xcode 5 中单独添加到 Storyboard 中的 UIViewController 后看不到 UIView

    我已将 UIView 拖放到 xcode 5 中情节提要中的 UIViewController 它已添加 但我在情节提要中看不到 UIView 有人有解决办法吗 在以前版本的 xcode 中 我确实按照以下链接描述的过程进行了操作 http
  • matlab:KeyPressFcn和WindowKeyPressFcn之间的区别

    Matlab 文档定义为KeyPressFcn是 由图形窗口具有焦点时发生的按键调用的回调函数 类似地 定义WindowKeyPressFcn是 当图形窗口或其任何子窗口具有焦点时发生的按键调用的回调函数 据我了解 图形的子对象是轴 绘图对
  • 使用同一库的两个版本

    我正在开发一个 iOS 项目 其中包含另一家公司创建的静态库 该库包含旧版本的 AFNeworking 我没有任何源文件 现在我需要使用 afneworking 的更新 且 bug 较少 版本 但我不能在项目中两次包含同一个类 当然 因为所
  • 使部分内容可编辑无法删除

    我有一个 contentEditable Div 我希望能够 保护 其中的部分免遭删除 例如 我有一个 contentEditable DIV 其中有一个 img 标签 我希望永远不会被删除 但我需要在用户键入时保持图像周围的文本流 htt
  • Selenium WebDriver 无需等待页面加载即可进入页面

    我正在使用 python api 将一些 Selenium RC 测试转换为 Selenium WebDriver 在 Selenium WebDriver 中 我注意到driver get http 似乎要等待整个页面加载后再继续 有没有
  • 使用 NSExpression 时捕获 NSInvalidArgumentException 的正确方法[重复]

    这个问题在这里已经有答案了 我想验证用户创建的表达式 例如 2 2 5 7 或更复杂 我使用 NSExpression 类来解析和计算这个表达式 这是我的游乐场代码 import UIKit let string 2 2 var ex NS
  • Chart.js 2.0 中背景的可接受范围突出显示

    我正在使用 Chart js 2 0 2 beta 构建一个简单的折线图 我想突出显示图表背景的特定范围以突出显示 可接受的范围 Here s an example of what I m wanting to recreate via C
  • 使用 MinGW 设置 GLFW

    我正在尝试使用 GLFW 学习 OpenGL 但遇到了一些问题 这是我的 main cpp include
  • 使用 DownloadManager 时 ListView 中的 Android ProgressBar

    我有一个 ListView 其中每个项目代表一个 PDF 文件 当用户单击某个项目时 应用程序必须将文件下载到外部存储上 现在下载无法正常运行 但这不是问题所在 我想要一个进度条 旋转轮样式 在下载文件时出现在列表的每个项目旁边 我的问题是
  • 在Python中打印变量的非Pythonic方式?

    最近有人向我演示 我们可以像 Perl 一样在 Python 中打印变量 代替 print s s s foo bar baz 我们可以这样做 print foo s bar s baz s locals 有没有一种看起来不那么老套的方式在
  • 给定日期范围内此查询的最快方法(最佳策略是什么)

    我有一个表 A 除了其他一些列之外 它还有一个 startDate 和一个 end dateDate 作为 2 个日期时间列 我有另一个表 B 其中有一个日期时间列 称为日期列 这是在 SQL Server 2005 中 这里的问题是 如何
  • Netbeans、Maven 和 Glassfish 的热部署变化

    最近我们从使用 ant 迁移到使用 Maven 在 Netbeans 中 我曾经在 WAR 中编辑和保存 html xhtml javascript css 文件 并且几乎立即可以在服务器上进行更改 现在 当我在 WAR 中编辑并保存这些类
  • Jackson databind 枚举不区分大小写

    如何反序列化包含不区分大小写的枚举值的 JSON 字符串 使用杰克逊数据绑定 JSON 字符串 url foo type json 和我的 Java POJO public static class Endpoint public enum