使用 GSON 将 JSON 转换为 Java 对象时如何覆盖 Java 映射?

2024-01-31

我有一个 JSON 字符串,如下所示:

{
 "status": "status",
 "date": "01/10/2019",
 "alerts": {
     "labels": {
         "field1": "value1",
         "field2": "value2",
         "field3": "value3",
         "field100": "value100"
     },
     "otherInfo" : "other stuff"
 },
 "description": "some description"
}

我对应的 Java 类如下所示:

public class Status {
    private String status;
    private String date;
    private Alerts alerts;
    private String description;
}

And

public class Alerts {
    private Map<String, String> labels;
    private String otherInfo;

    public Map<String, String> getLabels() {
        return labels();
    }
}

我使用以下方法将给定的 JSON 解析为 Java 对象:

Status status = gson.fromJson(statusJSONString, Status.class);

这也给了我 Status 类中的 Alerts 对象:

Alerts alerts = status.getAlerts();

这是我的问题:

让我们考虑一下labels:

我想在label映射不区分大小写。例如,如果提供的键/值对是"field1" : "value1", or "Field1" : "value1" or "fIeLD1":"value1",我希望能够通过简单地调用来检索它们alerts.getLabels.get("field1").

理想情况下,我想将按键设置为小写labels地图最初是创建的。我研究了 Gson 反序列化示例,但我不清楚如何解决这个问题。


您在这里无能为力。即使你扩展了HashMap,问题是当JSON反序列化时,它不会调用原生方法。您可以执行以下操作,但相当麻烦:

import java.util.HashMap;

public class HashMapCaseInsensitive extends HashMap<String, String> {

    private boolean convertedToLower = false;

    @Override
    public String put(String key, String value) {
        if(!convertedToLower){
            convertToLower();
        }
        return super.put(key.toLowerCase(), value);
    }

    @Override
    public String get(Object key) {
        if(!convertedToLower){
            convertToLower();
        }
        return super.get(key.toString().toLowerCase());
    }

    private void convertToLower(){
        for(String key : this.keySet()){
            String data = this.get(key);
            this.remove(key);
            this.put(key.toLowerCase(), data);
        }
        convertedToLower = true;
    }

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

使用 GSON 将 JSON 转换为 Java 对象时如何覆盖 Java 映射? 的相关文章

  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • Android - 以编程方式选择菜单选项

    有没有办法以编程方式选择菜单选项 基本上 我希望视图中的按钮能够执行与按特定菜单选项相同的操作 我正在考虑尝试调用 onOptionsItemSelected MenuItem item 但我不知道要为菜单项添加什么 是的 有一种方法可以选
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • 在 Twitter 搜索 API 1.1 中排除转发

    在这里 我尝试使用搜索 api 1 1 检索带有 V57 标签的推文 通过使用转储并查看搜索词的结果 search tim connection gt get search tweets array q gt V57 count gt 5
  • 覆盖 Logback 错误输出

    在我的自定义异常类中 我已经重写了toString Override public String toString final String msg getLocalizedMessage base String str getClass
  • 给定一个双调数组和数组中的元素 x,在 2log(n) 时间内找到 x 的索引

    首先 这个问题的双调数组被定义为对于某些索引K在长度数组中N where 0 lt K lt N 10到K是单调递增的整数序列 K到N 1是单调递减的整数序列 例子 1 3 4 6 9 14 11 7 2 4 9 它从 1 单调增加到 14
  • 如何查找 MySQL 表中的所有大写字符串?

    我最初认为这是微不足道的 然后认为 二进制 可以做到这一点 我现在不确定 Name John MARY Kin TED 我只想查询 MARY 和 TED 它们都是大写的 我该如何查询这个 如果您的排序规则不区分大小写 那么您需要使用BINA
  • Love2d和Lua中的继承

    我有一个包含这组值和函数的类 require class entity class new function entity new self x 100 self y 100 self width 32 self height 32 sel
  • 表单提交和Ajax同时使用onsubmit?

    如果之前有人问过这个问题 我很抱歉 但我需要通过表单提交和单击提交时触发的 ajax 调用来发送表单数据 原因是因为用户被重定向 并且我想预先将 det 表单数据存储到我的数据库中 所以我尝试使用表单 onsubmit 和 fire 提交表
  • ASP.NET 中

    我有一个在 asp net 框架上使用 SVG 坐标的网页 通过尝试错误 如果我取出大部分标签 我不会收到错误 但如果所有标签都在我收到以下错误 Compiler Error Message CS8095 Length of String
  • Asp.Net - 检测到页面上没有 javascript? (已更名标题)

    我有一个页面 在 TabContainer 中显示其所有内容 但如果浏览器上禁用了 javascript 它只会显示一个空白页面 我可以添加一个
  • 当 sed 在 mingw 中就地编辑时权限被拒绝

    我正在使用 mingw sed i s a b test txt sed preserving permissions for sed003480 Permission denied 我可以触摸 rm当前目录中的文件 这是由 Windows
  • ios 7 UiView 框架问题

    我在 iOS6 和 iOS7 中运行相同的应用程序 其中有导航栏 它在 iOS6 上运行良好 但在 iOS7 中 所有视图都有点向上 就像根本没有考虑导航栏一样 我尝试更改模拟指标选项中的顶栏属性 但它不起作用 在 iOS6 中 它从导航栏
  • 在 POST/batches 请求中使用现有的 SparkSession

    我正在尝试使用Livy远程提交多个Spark jobs 假设我想执行以下操作spark submit远程任务 包含所有选项 spark submit class com company drivers JumboBatchPipelineD
  • Serilog - 无法根据属性记录到多个文件

    您好 我正在尝试使用以下命令在一个文件中记录一些消息 在另一个文件中记录其他消息Serilog 我尝试过以下配置 Log Logger new LoggerConfiguration WriteTo Map type audit name
  • ndb async 是否保证在应用程序请求完成后执行?

    我正在使用 ndb 编写一个分析模型 该模型根据应用程序请求记录一些数据 每个请求通过ndb put async调用一个ndb请求来记录数据 而客户端不关心结果 本质上 我不希望应用程序请求等待保存统计数据以进行分析 然而 我对官方文档的解
  • Android设置壁纸出错了

    所以我很久以前就在开发壁纸更换器并发布了它 一段时间后 我开始收到壁纸尺寸调整不正确的评论 我还尝试了不同尺寸的鸸鹋 它们是正确的 我正确地缩放位图等 但不知何故 android倾向于将壁纸重新缩放得更大 有办法避免吗 我的代码 Displ
  • 与 VB.NET 中的 Array() 等效吗?

    在 VB6 中你可以这样做 Dim a As Variant a Array 1 2 3 你能在 VB NET 中使用特定类型做类似的事情吗 Dim a As Integer a Array 1 2 3 Dim a As Integer N
  • 命名空间“std”中没有名为“unary_function”的模板;您的意思是“__unary_function”吗?

    刚刚将我的 Xcode 升级到 15 0 突然它开始在 RCT Folly 中出现以下错误 No template named unary function in namespace std did you mean unary funct
  • 在运行时转储 gcov 数据

    我正在使用 gcov 收集我正在从事的 C 项目的代码覆盖率数据 据我所知 一旦程序完成后退出 gcov 就会转储代码覆盖率数据 如何收集长时间运行的进程的 gcov 数据 比如说 我的程序是一个操作系统的内核 该操作系统在永不关闭的服务器
  • iOS:Xcode 中的 ImageMagick 编译器警告

    我在 iOS 项目中使用 ImageMagick 但是该库已经过时 因为以前的开发人员使用了源代码 我使用的是 Xcode 6 3 2 我想使用 Cocoapods 将 ImageMagick 集成到项目中 而不是复制源文件 然而 当我将
  • SDL_ttf找不到“SDL.h”,但main.cpp可以

    我正在编写一个 make 文件来编译一个非常简单的 SDL2 程序 到目前为止 它编译 SDL2 得很好 现在我正在编译扩展框架 SDL2 image 和 SDL ttf 看起来MAKE正确地找到了SDL ttf h 但是SDL ttf h
  • 使用 GSON 将 JSON 转换为 Java 对象时如何覆盖 Java 映射?

    我有一个 JSON 字符串 如下所示 status status date 01 10 2019 alerts labels field1 value1 field2 value2 field3 value3 field100 value1