您如何使用 Jackson 将 JSON 对象键解析为整数?
How do you parse JSON object keys as integers with Jackson?
我正在将 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();
}
}
我在 try
块的第二行收到此 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
异常。
我什至尝试更改 int index = enty.getKey().intValue()
。但仍然出现相同的异常。
P.S.: 我 运行 它在 Android 工作室使用 Robolectric 框架。
这些键不是整数,它们是字符串。请注意它们的引号:
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}";
// ------------------------^^-^^-----------^^-^^------------^^-^^
如果这是 JSON(似乎是),对象 属性 名称是 始终 字符串。
您需要一个 Map<String, String>
,然后您需要明确地将键解析为 int
(如果需要)。
Jackson 可以将密钥反序列化为某些默认类型(或具有一些额外配置的自定义类型)。
由于 Map
是通用类型,您需要使用 TypeReference
来描述您想要的参数化。
reader
is deprecated since 2.5. You should use readerFor
代替。通过为 Map
提供适当的 TypeReference
和 Integer
键来构造您的 ObjectReader
。然后 Jackson 会知道您期望 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
我正在将 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();
}
}
我在 try
块的第二行收到此 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
异常。
我什至尝试更改 int index = enty.getKey().intValue()
。但仍然出现相同的异常。
P.S.: 我 运行 它在 Android 工作室使用 Robolectric 框架。
这些键不是整数,它们是字符串。请注意它们的引号:
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}";
// ------------------------^^-^^-----------^^-^^------------^^-^^
如果这是 JSON(似乎是),对象 属性 名称是 始终 字符串。
您需要一个 Map<String, String>
,然后您需要明确地将键解析为 int
(如果需要)。
Jackson 可以将密钥反序列化为某些默认类型(或具有一些额外配置的自定义类型)。
由于 Map
是通用类型,您需要使用 TypeReference
来描述您想要的参数化。
reader
is deprecated since 2.5. You should use readerFor
代替。通过为 Map
提供适当的 TypeReference
和 Integer
键来构造您的 ObjectReader
。然后 Jackson 会知道您期望 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