Jackson JSON - 反序列化 Commons MultiMap

2023-11-26

我想使用 JSON 序列化和反序列化 MultiMap (Apache Commons 4)。

要测试的代码段:

MultiMap<String, String> map = new MultiValueMap<>();
map.put("Key 1", "Val 11");
map.put("Key 1", "Val 12");
map.put("Key 2", "Val 21");
map.put("Key 2", "Val 22");

ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(map);
MultiMap<String, String> deserializedMap = mapper.readValue(jsonString, MultiValueMap.class);

序列化工作正常,并产生我期望的格式:

{"Key 1":["Val 11","Val 12"],"Key 2":["Val 21","Val 22"]}

不幸的是,反序列化产生的结果不是它应该的样子: 反序列化后,Multimap 包含一个ArrayList 内的 ArrayList对于键的值,而不是包含值的键的单个 ArrayList。

产生这个结果的原因是put()调用 Multi Map 的方法来添加在 json 字符串中找到的数组,因为 MultiMap 实现了 Map 接口。

如果将新值放入不存在的键,则 MultiMap 实现本身会再次创建一个 ArrayList。

有什么办法可以规避这个问题吗?

感谢您的帮助!


从牛津词典可以看出,规避意味着“找到绕过(障碍)的方法”,这里有一个简单的解决方法。

首先,我创建了一个生成与上面相同的 MultiValueMap 的方法。我使用相同的方法将其解析为 json 字符串。

然后我创建了以下反序列化方法

public static MultiMap<String,String> doDeserialization(String serializedString) throws JsonParseException, JsonMappingException, IOException {

    ObjectMapper mapper = new ObjectMapper();
    Class<MultiValueMap> classz = MultiValueMap.class;
    MultiMap map = mapper.readValue(serializedString, classz);
    return (MultiMap<String, String>) map;


}

当然,这本身就属于您上面提到的确切问题,因此我创建了doDeserializationAndFormat方法:它将迭代给定键对应的每个“列表中的列表”,并将值一一关联到该键

public static MultiMap<String, String> doDeserializationAndFormat(String serializedString) throws JsonParseException, JsonMappingException, IOException {
    MultiMap<String, String> source = doDeserialization(serializedString);
    MultiMap<String, String> result  =  new MultiValueMap<String,String>();
    for (String key: source.keySet()) {


        List allValues = (List)source.get(key);
        Iterator iter = allValues.iterator();

        while (iter.hasNext()) {
            List<String> datas = (List<String>)iter.next();

            for (String s: datas) {
                result.put(key, s);
            }
        }

    }

    return result;

}

这是 main 方法中的一个简单调用:

MultiValueMap<String,String> userParsedMap = (MultiValueMap)doDeserializationAndFormat(stackMapSerialized);
System.out.println("Key 1 = " + userParsedMap.get("Key 1") );
System.out.println("Key 2 = " + userParsedMap.get("Key 2") );

json to multivaluemap

希望这可以帮助。

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

Jackson JSON - 反序列化 Commons MultiMap 的相关文章

随机推荐

  • Android LocationManager.isProviderEnabled() 始终返回 false

    我有一个使用网络提供商作为其位置的应用程序 每次应用程序启动时 它都会检查网络提供商是否已启用isProviderEnabled LocationManager 中的方法 如果返回 false 我会向用户发出警报以启用网络提供商 然后使用该
  • 寻找转换器:php 到 javascript [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道是否有任何可用的转换器 可以将 简单 php 代码转换为 javascript 我是什么not寻找的是 ajax 东西或模仿 php 功能的
  • 无限可枚举仍然是“可枚举的”吗?

    就像两条重叠的线段一样 我们可以找到无限的交点 列举所有这些点可能没有意义 我们可能只是想表明这个集合是无穷大的 浮点数已定义NegativeInfinity and PositiveInfinity 一个数字代表count or ordi
  • sql中查找同一个表中连续两行之间的时间差

    我被困住了 我一直在寻找答案 但似乎无法找到从同一张表的两个不同行中减去同一张表中适合的时间 我在执行以下查询时遇到困难 在下表中 我想区分一行的 TimeOut 和下一行的 TimeIn 请考虑在下表中查找第 1 行中的 TimeOut
  • 带有分支过滤器的 GitHub Actions 标签过滤器

    GitHub 操作允许使用分支和标签过滤器 但它们似乎不能一起工作 例如 此工作流在推送到 master 时运行or用标签推动 name npm Publish on push branches master tags v 我想设置一个发布
  • Excel 多个条件的中位数

    基本上在Excel中我想要一张表格 就像下面右边给出的那样 我的数据规模比给出的例子大得多 它有每个主题 每个条件的中位数 例如TADA TADP TPDA TPDP 理想情况下 我会使用数据透视表 但是 Excel 不会在数据透视表中执行
  • Python3双向串口通信:读入数据

    我正在尝试通过Python3建立双向通信 我的 USB 端口之一插入了一个激光测距仪 我想向其发送 接收命令 我有一张可以发送的命令以及它们将返回的内容 因此这部分已经存在 我需要的是一种实时方便的方法 到目前为止我有以下代码 import
  • GameKit 无线网络连接?

    我读到 从 iPhone OS 3 1 开始 GameKit 支持 wifi 连接 但文档指出 如果您的应用程序配置了 对等选择器允许互联网 连接 您的应用程序必须 还解雇同行选择器和 提供自己的配置界面 互联网连接 这还成立吗 如果是这样
  • 为什么我的类型化数据集不喜欢临时表?

    我正在尝试将表适配器添加到 SQL Server 2005 Express 中的存储过程 然而 存储过程使用一个名为 temp 的临时表 创建表适配器时 Visual Studio 抱怨 未知对象 temp 并表示存储过程返回 0 列 这是
  • 如何静音“其类型使用匿名命名空间 [-Werror]”gcc 版本 4.8.2

    在我的项目的一个头文件中 以下行包含在inline method typedef boost archive iterators transform width
  • Codeigniter/PHP 会话安全问题

    我正在使用 Codeigniter 开发一个 Web 应用程序 当用户通过我的网站进行身份验证时 我当前将他们的 用户标识符 存储在我的会话 cookie 中 我已启用加密 我的几个模型类使用会话 cookie 的 用户标识符 参数中的值来
  • 如何放大矩形中绘制的填充样式? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在使用 Net 绘图来绘制图表 它本质上是一个堆积条形图 我遇到的问题是 我想减少填充样式中的线条数量 以便在某种程度上放大它以使其更清晰 我环顾四周 但没有发现任何可以帮助我的东
  • 如何在 vtkStructuredGrid 上设置数据值

    我正在尝试用分析字段填充结构化网格 但是尽管阅读了 vtk 文档 我还没有找到如何在网格点实际设置标量值或设置网格的间距 原点信息 从下面的代码开始 我该如何 将空间信息与网格相关联 即单元格 0 0 0 位于坐标 0 0 0 每个方向的间
  • 使用selenium保存页面中的图像

    我正在使用 Selenium 和 Google Chrome 驱动程序以编程方式打开页面 每个页面上都有一个我想下载的动态生成的图像 目前 我正在等待页面完成加载 然后获取图像 URL 并使用 System Net WebClient 下载
  • 如何创建线程安全的ContentProvider?

    Android 文档说 可以从各种 ContentResolver 调用 ContentProvider 方法 不同进程和线程中的对象 必须实现它们 以线程安全的方式 我在 Stackoverflow 上找到了这篇文章Android sql
  • go float 零除编译器错误

    这种行为有何意义 只打印编译器警告而不是错误不是更有意义吗 func main var y float64 0 0 var x float64 4 0 y fmt Println x Inf func main var x float64
  • 如何仅更改 javafx css 中的左填充

    我经常使用 html css 但我对 javafx css 完全陌生 所以这将是一个新手问题 但我在任何地方都找不到答案 我有一个充满标签的大网格窗格 除了其他标签之外 我可以为所有这些标签设置填充 例如 GridPane containe
  • C++ 中的越界和未定义的行为

    我知道在 C 中 超出缓冲区范围的访问是未定义的行为 这是来自 cppreference 的示例 int table 4 bool exists in table int v return true in one of the first
  • 两个字符相加产生 int

    我制作了一个简单的程序并使用 GCC 4 4 4 5 编译它 如下所示 int main char u 10 char x x char i u x return 0 g c Wconversion a cpp 我有以下内容 a cpp I
  • Jackson JSON - 反序列化 Commons MultiMap

    我想使用 JSON 序列化和反序列化 MultiMap Apache Commons 4 要测试的代码段 MultiMap