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 枚举不区分大小写 的相关文章

  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 编辑文件名在 JComboBox 中的显示方式,同时保持对文件的访问

    我对 Java 很陌生 对堆栈溢出也很陌生 我正在尝试利用 JMF API 创建一个用 Java 编码的简单媒体播放器 到目前为止 我已经能够设置一个简单的队列 播放列表来使用JComboBox called playListHolder
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的

随机推荐

  • 如何在不重新启动服务器的情况下停止 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