首页 > 解决方案 > JSON 中的 LinkedHashMap 在 get() 上返回 null

问题描述

LinkedHashMap<Byte, Integer>我从 JSON构建一个。当我记录条目时,它们就在这里,但是当我调用get()(例如 40)时,它返回 null。我哪里错了?

    String json = "{\"0\":0,\"34\":0,\"36\":0,\"38\":0,\"40\":3}";
    Gson gson = new GsonBuilder().create();
    LinkedHashMap<Byte, Integer> map = new LinkedHashMap<>();
    map = gson.fromJson(json, map.getClass());

    for (Map.Entry<Byte, Integer> entry : map.entrySet()) {
        Log.i(TAG, "item[" + entry.getKey() + "] = " + entry.getValue());
    }
    Log.i(TAG, "map.get(40) = " + map.get(40));

输出 :

item[0] = 0.0
item[34] = 0.0
item[36] = 0.0
item[38] = 0.0
item[40] = 3.0
map.get(40) = null

标签: javaandroid

解决方案


那么问题是键的类型不是Byte- 它们是String。仅仅因为您进行了转换,并不意味着库会正确反序列化它,它不会查看您声明的 java 类型,而是查看 的第二个参数,在这种情况下fromJson,这只是一个LinkedHashMap没有泛型的参数。

所以基本上:map.get("40");

并将其正确反序列化为Byte,您可以:

LinkedHashMap<Byte, Integer> map = gson.fromJson(json, TypeToken.getParameterized(LinkedHashMap.class, Byte.class, Integer.class).getType());
System.out.println("map.get(40) = " + map.get((byte)40));

推荐阅读