如何将JSON对象键解析为与Jackson的整数?

时间:2016-07-15 07:15:08

标签: java json jackson classcastexception coercion

我将JSON反序列化为Map<Integer, String>

但是如果我尝试将key分配给原始int,我会得到上面的classCastException。

ObjectReader reader = new ObjectMapper().reader(Map.class);
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}";
Map<Integer, String> map = reader.readValue(patternMetadata);
System.out.println("map: " + map);
for (Map.Entry<Integer, String> entry : map.entrySet())
{
    try
    {
        System.out.println("map: " + entry.getKey());
        int index = entry.getKey();
        System.out.println("map**: " + index);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

我在java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer区块的第二行收到此try例外。

我甚至尝试过更改int index = enty.getKey().intValue()。但仍然会发生同样的异常。

P.S。:我在使用Robolectric框架的Android工作室中运行它。

2 个答案:

答案 0 :(得分:4)

这些键不​​是整数,它们是字符串。注意它们上的引号:

String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}";
// ------------------------^^-^^-----------^^-^^------------^^-^^

如果这是JSON(似乎是),对象属性名称​​总是字符串。

您需要Map<String, String>,然后您需要明确解析int的密钥(如果需要)。

答案 1 :(得分:2)

杰克逊可以将密钥反序列化为某些默认类型(或带有一些额外配置的自定义类型),如果你告诉它的话。

由于Map是通用类型,因此您需要使用TypeReference来描述所需的参数化。

自2.5以来,

reader已被弃用。您应该使用readerFor代替。通过为ObjectReader提供适当的TypeReference Integer密钥来构建您的Map。然后,杰克逊会知道您希望Integer值作为地图的关键。

ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Map<Integer, String>>() {
});

完整示例

ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Map<Integer, String>>() {
});
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}";
Map<Integer, String> map = reader.readValue(patternMetadata);
System.out.println("map: " + map);
for (Map.Entry<Integer, String> entry : map.entrySet()) {
    try {
        System.out.println("map: " + entry.getKey());
        int index = entry.getKey();
        System.out.println("map**: " + index);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

打印

map: {1=name, 2=phone, 3=query}
map: 1
map**: 1
map: 2
map**: 2
map: 3
map**: 3