【问题标题】:Transform Map<List<Long>,List<Long>> to String and Back将 Map<List<Long>,List<Long>> 转换为字符串并返回
【发布时间】:2014-11-18 11:28:08
【问题描述】:

我尝试用 Gson 来做,但你不必运行代码就可以看到它没有多大意义:

final Map<List<Double>, List<Double>> map = new Gson().fromJson("{[111,222]=[333,444], [555,666]=[777,000]}", Map.class);

我得到一个 MalformedJsonException。有没有人知道如何在不必创建自定义类的情况下做到这一点?

它不能与 Json 相关,也欢迎其他方法。而且它不必是地图,它可以是对的列表,无论如何我永远不会使用列表作为键进行搜索,我只会遍历它。

我期待阅读您的新想法 :)

【问题讨论】:

  • 不是有效的 JSON?测试一下HERE
  • 重点不是使用Json,重点是(反)序列化一个Map(from)到一个String。
  • 你的字符串格式固定了吗?
  • 不,我只想要最后那个对象,字符串也可以看起来像一个sha1哈希。

标签: java json dictionary serialization


【解决方案1】:

这有点hacky,但可以用作反序列化字符串的方法。 序列化将使用 Gson.toJson(map) 完成。

    final Map<String, List<Double>> map = new Gson().fromJson("{\"[1,2,3,5]\"=[4,5,6]}", Map.class);
    final Map<List<Long>, List<Long>> result = Maps.newHashMap();
    for (final Map.Entry<String, List<Double>> entry : map.entrySet()) {
        final List<Long> value = Lists.newArrayList();
        for (final Double number : entry.getValue()) {
            value.add(number.longValue());
        }
        final List<Double> rawKey = new Gson().fromJson(entry.getKey(), List.class);
        final List<Long> key = Lists.newArrayList();
        for (final Double number : rawKey) {
            key.add(number.longValue());
        }
        result.put(key, value);
    }
    System.out.println(result);

【讨论】:

    【解决方案2】:

    您的 JSON 字符串错误有两个原因:

    1. 数组不能是键,即[555,666]作为键无效
    2. 将键与值关联的符号是:,而不是=

    【讨论】:

    • 1.我知道,这就是为什么我建议使用 Json 的替代品并写道“没有多大意义”; 2.错了,用Gson你也可以用=(至少对地图来说)。
    • 但是如果不是JSON,那只是一种不存在的格式,所以你得实现自定义解析,可能是语法或者正则表达式。
    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 2013-11-25
    • 2018-04-07
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多