我对类型转换有疑问。我有以下JSON字符串:
{"server":"clients","method":"whoIs","arguments":["hello"]}
我正在将其解析为以下Map< String,Object>。
{arguments=[hello], method=whoIs, server=clients}
现在可以执行以下操作:
request.get("arguments");
这很好用。但我需要获取存储在参数中的数组。我怎么能做到这一点?我试过(例如)以下内容:
System.out.println(request.get("arguments")[0]);
但当然这不起作用..
这怎么可能?
答案 0 :(得分:3)
最有可能的是,价值是java.util.List
。所以你可以访问它:
System.out.println(((List<?>) request.get("arguments")).get(0));
但是为了更方便的访问,或许可以查看Jackson,特别是Tree Model:
JsonNode root = new ObjectMapper().readTree(source);
System.out.println(root.get("arguments").get(0));
杰克逊当然也可以绑定到常规地图,这可以像:
Map<?,?> map = new ObjectMapper().readValue(source, Map.class);
但是由于强制转换而无法正常处理空值,因此访问Maps会不那么方便。
答案 1 :(得分:0)
也许
System.out.println( ((Object[]) request.get("arguments")) [0]);
?您也可以尝试将其转换为String[]
。
无论如何,有更多文明的解析JSON的方法,例如http://code.google.com/p/google-gson/。
答案 2 :(得分:0)
StaxMan是正确的,Java中JSON数组的类型是List
(以ArrayList
为实现),假设JSON被反序列化,类似于
Map<String, Object> map = JSONParser.defaultJSONParser().parse(Map.class, jsonInput);
通过简单地检查类型来确定这些事情很容易。
Map<String, Object> map = JSONParser.defaultJSONParser().parse(Map.class, jsonInput);
System.out.println(map);
for (String key : map.keySet())
{
Object value = map.get(key);
System.out.printf("%s=%s (type:%s)\n", key, value, value.getClass());
}
输出:
{arguments=[hello], method=whoIs, server=clients}
arguments=[hello] (type:class java.util.ArrayList)
method=whoIs (type:class java.lang.String)
server=clients (type:class java.lang.String)
此外,the svenson documentation on basic JSON parsing描述&#34; [b] y默认情况下,数组将被解析为java.util.List
个实例&#34;。