2013-03-12 182 views
2

我正在开发Android REST客户端。我们使用JSON作为数据交换格式,因此我使用了Jackson解析器。我从服务器获得不同的Json响应,如简单阵列:无法解析Jackson的LinkedHashMap数组的JSON数组

{"user_id":"332","user_role":"1"} 

或别的东西。所有这些东西,我解析到LinkedHashMap<String, Object>,一切完美的作品,但是当我从服务器这样的响应:

[ { "user_id":"352", 
    "user_role":"expert", 
    "name":"Test 12-18", 
    "description":"Test" }, 

    { "user_id":"263", 
    "user_role":"novice lab", 
    "name":"Tom's Desk", 
    "description":"Desk"} 
] 

我得到空:{}后parsing.Here是我的代码,我用杰克逊:

ObjectMapper mapParametersToJSON = new ObjectMapper(); 
String serverResponseBody = responseFromServer.getBody(); 
LinkedHashMap<String, Object> resultofOperation = new LinkedHashMap<String, 
    Object>(); 
TypeReference<LinkedHashMap<String,Object>> genericTypeReferenceInformation = new 
    TypeReference<LinkedHashMap<String,Object>>() {}; 
    try { 
    resultofOperation = mapParametersToJSON.readValue(serverResponseBody, 
     genericTypeReferenceInformation); 

那么,为什么杰克逊没有解析这个呢?我怎样才能解决这个问题?

+1

为什么你不使用默认的Json Parser Api? – 2013-03-12 16:22:22

回答

4

您问题中的第一个JSON是地图或对象。第二个是数组。你不解析一个数组,你正在解析一个地图。

你需要做这样的事情:

List<MyClass> myObjects = mapper.readValue(jsonInput, new TypeReference<List<MyClass>>(){}); 

与答案here几乎相同的问题。

+0

Ok.But是否有任何方法来确定JSON类型:对象或数组,以便我可以使用一些if/else时将写入mapper.readvalue? – MainstreamDeveloper00 2013-03-12 16:20:35

+0

我在制作中没有使用过Jackson,但看起来'JsonNode'有一个'isArray()'方法。我的理解是,当你使用映射器时,你通常知道你在映射什么;如果没有,你可能会使用DOM。 – 323go 2013-03-12 16:27:22

+2

您也可以使用Mapper绑定到'JsonNode':'JsonNode root = mapper.readValueAsTree(source);' – StaxMan 2013-03-12 16:58:30

0

在JSON中,{"key": "value"}是Object,而["this", "that"]是Array。

所以,如果你收到对象数组,你应该使用类似List<Map<Key, Value>>的东西。

0

您正面临错误,因为[]构造不能翻译成Map参考,只能在List或数组中。

我会建议做一些这样:

ObjectMapper objectMapper = new ObjectMapper(); 

List<Map<String,String>> parsedResult = objectMapper.reader(CollectionType.construct(LinkedList.class, MapType.construct(LinkedHashMap.class, SimpleType.construct(String.class), SimpleType.construct(String.class)))).readValue(serverResponseBody); 

//if you need the one result map 
Map<String, String> resultMap = new LinkedHashMap<String, String>(); 

for (Map<String, String> map: parsedResult){ 
    resultMap.putAll(map); 
} 
5

其他人提出的问题,但解决方案是有点不完整。如果您需要处理JSON对象和数组,你可以绑定到java.lang.Object,检查类型:

Object stuff = objectMapper.readValue(json, Object.class); 

,你会得到任何ListMap(具体ArrayListLinkedHashMap,默认情况下,这些默认设置可以被改变)。

或者你也可以做JSON树木JsonNode

JsonNode root = objectMapper.readTree(json); 
if (root.isObject()) { // JSON Object 
} else if (root.isArray()) { ... 
} 

后者往往更加方便。

的好处之一是,你仍然可以创建规则的POJO出来的这些,例如:

如果(root.isObject()){ myObject的OB = objectMapper.treeToValue(MyObject.class); } // 或Object,使用objectMapper.convertValue(ob, MyObject.class)

所以你甚至可以有不同的类型的不同处理;来回不同的表示。