Gson:有没有更简单的方法来序列化地图

2023-11-29

ThisGson 项目的链接似乎表明我必须执行类似以下操作才能将类型化 Map 序列化为 JSON:

    public static class NumberTypeAdapter 
      implements JsonSerializer<Number>, JsonDeserializer<Number>,
InstanceCreator<Number> {

    public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext
context) {
      return new JsonPrimitive(src);
    }

    public Number deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
        throws JsonParseException {
      JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
      if (jsonPrimitive.isNumber()) {
        return jsonPrimitive.getAsNumber();
      } else {
        throw new IllegalStateException("Expected a number field, but was " + json);
      }
    }

    public Number createInstance(Type type) {
      return 1L;
    }
  }

  public static void main(String[] args) {
    Map<String, Number> map = new HashMap<String, Number>();    
    map.put("int", 123);
    map.put("long", 1234567890123456789L);
    map.put("double", 1234.5678D);
    map.put("float", 1.2345F);
    Type mapType = new TypeToken<Map<String, Number>>() {}.getType();

    Gson gson = new GsonBuilder().registerTypeAdapter(Number.class, new
NumberTypeAdapter()).create();
    String json = gson.toJson(map, mapType);
    System.out.println(json);

    Map<String, Number> deserializedMap = gson.fromJson(json, mapType);
    System.out.println(deserializedMap);
  }

很酷,这很有效,但看起来开销太大了(整个类型适配器类?)。我使用过其他 JSON 库,例如 JSONLib,它们允许您通过以下方式构建地图:

JSONObject json = new JSONObject();
for(Entry<String,Integer> entry : map.entrySet()){
     json.put(entry.getKey(), entry.getValue());
}

或者,如果我有一个自定义类,如下所示:

JSONObject json = new JSONObject();
for(Entry<String,MyClass> entry : map.entrySet()){
 JSONObject myClassJson =  JSONObject.fromObject(entry.getValue());
     json.put(entry.getKey(), myClassJson);
}

该过程更加手动,但需要的代码更少,并且在大多数情况下没有为 Number 创建自定义类型适配器的开销为我自己的定制课程.

这是使用 Gson 序列化地图的唯一方法吗?或者是否有人找到了一种比上面链接中 Gson 推荐的方法更好的方法。


只有TypeToken部分是必要的(当涉及遗传学时)。

Map<String, String> myMap = new HashMap<String, String>();
myMap.put("one", "hello");
myMap.put("two", "world");

Gson gson = new GsonBuilder().create();
String json = gson.toJson(myMap);

System.out.println(json);

Type typeOfHashMap = new TypeToken<Map<String, String>>() { }.getType();
Map<String, String> newMap = gson.fromJson(json, typeOfHashMap); // This type must match TypeToken
System.out.println(newMap.get("one"));
System.out.println(newMap.get("two"));

Output:

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

Gson:有没有更简单的方法来序列化地图 的相关文章

随机推荐

  • 即使提供了参数,过程仍需要参数

    我看到其他一些人也面临着类似的问题 我已阅读并检查了标题为的问题过程需要未提供的参数 我认为这可以解决我的问题 但我错了 我确实检查了那里建议的步骤 但没有成功 这是我的代码 oOleDbCommand CommandText usp Pe
  • 如何在 iPhone 上以卡拉 OK 风格显示歌词?

    我目前正在创建一个播放音乐的应用程序 我想添加一个功能 在播放音乐时显示音乐歌词 并标记文本的当前位置以匹配歌曲中的当前位置 弹跳球效果 就像您在播放歌曲时在每个卡拉 OK 屏幕上看到的一样 我一直在考虑扩展我的咖啡馆文件 添加 字符串块
  • 实体框架查找方法无法正常工作

    我有名为 课程 学生 和 教师 的课程 如下所示 public class Course Key DatabaseGenerated DatabaseGenerationOption Identity public Guid CourseI
  • 如何将 Bluebird 与 Angular 结合使用?

    我尝试使用 Angular 和 Bluebird 承诺 HTML div name also div JS javascript var app angular module HelloApp app controller HomeCont
  • 通过 Powershell 更改 Chrome 设置

    我想编写一个脚本来更改 Chrome 中的默认页面缩放 但我不知道这些选项存储在哪里 我想我必须找到一个合适的选项文本文件 解析它 然后使用 powershell 进行文本替换才能应用更改 每次将笔记本电脑连接到外部显示器时 我都需要执行此
  • 非拉丁字符和哎哟

    我正在了解 Cake PHP 它发现了一个关于 PHP MySQL 字符集内容最佳实践的一般问题 我希望可以在这里得到解答 我的 练习 系统包含一个 mysql 电影表 该列表源自 Excel 工作表 该工作表导出为 CSV 并通过 php
  • 亚马逊 Linux 上的 uwsgi 新贵

    我按照本教程创建了一个 uwsgi 文件https uwsgi readthedocs org en latest Upstart html在亚马逊Linux上 虽然它似乎没有运行 因为 Nginx 只是说网关不好 如果我运行 etc in
  • JLabel:异步加载 HTML 图像

    A JLabel允许 HTML 内容 其中可以包含图像 String html img src JLabel label new JLabel html 请注意 我使用JLabel用于渲染图像JXTreeTable 因此更新文本JLabel
  • 如何从 C# 应用程序中将焦点设置到桌面

    Winforms 应用程序 Net 3 5 我需要将焦点从 C 应用程序设置到用户桌面 几乎就像模拟鼠标在桌面上单击一样 有人可以告诉我如何用 C 做到这一点吗 我只想将焦点设置在桌面上 以便焦点不再位于我的应用程序上 但我想在我的应用程序
  • 在 Perl 中打印字符串

    有没有一种简单的方法 也许使用子例程 在 Perl 中打印字符串而不转义每个特殊字符 这就是我想做的 print DELIMITER i DELIMITER 显然 如果我可以使用字符串而不是特殊字符作为分隔符 那就太好了 佩尔多克 佩洛普
  • 多线程并发访问和全局互斥

    OpenSSL 常见问题解答指出它可以在线程应用程序中使用 1 OpenSSL是线程安全的吗 如果应用程序设置了线程回调函数 答案是肯定的 此回调函数引用全局 SSL 锁 因此如果您有 2 个 ssl 连接运行 它们都将使用此全局锁 然而
  • Spring Oauth2隐式流程

    致力于使用 Spring 实现 Oauth2 我想实现隐式工作流程 我的配置文件 Configuration EnableAutoConfiguration RestController public class App Autowired
  • 打开我的应用程序以获取特定文件和 URL 扩展名 - 意图过滤器未按预期工作

    问题 如何让我的应用程序无条件打开文件和 URL 扩展名 我对设置我的intent filter因为这些都没有任何意义 我的最终目标是开放任何有path以某个扩展结尾 为了举例 我们选择 riley 作为我的目标延伸 我的基地 意图过滤器
  • 使用 if 语句检查 div 是否为空

    如果单独的 div 为空 我尝试删除特定的 div 这是我正在使用的 document ready function if leftmenu empty menuTitleWrapper remove middlemenu css righ
  • 将加拿大邮政编码转换为经度和纬度

    我有 100 个加拿大邮政编码的列表 例如M4B 1C7 有没有办法将这些邮政编码转换为近似的经度和纬度值 目前 我正在使用以下网站手动执行此操作 https geocoder ca 在 R 中是否有更快的方法来做到这一点 我碰到tidyg
  • GDB 是否正确解释内存地址?

    我正在使用 GDB 检查内存地址的内容 但不知道它是否正确显示 gdb p char 0x8182f40 4 0x8182f40 XYZ gdb gdb x 40x 0x8182f40 16 0x8182f30 0x00000000 0x0
  • 使用 PHP 从 html 代码获取 Youtube 视频 ID

    我想从 html 代码获取所有 YouTube 视频 ID 查看 YouTube 视频的 或多个 对象 嵌入代码 来自数据库的html p loremm ipsum dolor sit amet enot a href link ancho
  • Subsonic:将 SharedDbConnectionScope 与 TransactionScope 一起使用似乎已损坏

    使用下面的代码 预期的行为是数据库不会反映更新 因为从未调用 ts Complete 但更新似乎已完成 但是 如果我省略 SharedDbConnectionScope 则会看到预期的行为 SharedDbConnectionScope 有
  • 目录、模式、用户和数据库实例之间的关系

    要比较不同供应商 Oracle SQL Server DB2 MySQL 和 PostgreSQL 的数据库 如何唯一地标识任何对象 我是否需要目录 例如 在 Java 的 DatabaseMetadata 中 我至少应该指定目录和模式 f
  • Gson:有没有更简单的方法来序列化地图

    ThisGson 项目的链接似乎表明我必须执行类似以下操作才能将类型化 Map 序列化为 JSON public static class NumberTypeAdapter implements JsonSerializer