2

我正在开发一个 Android REST 客户端。我们使用 JSON 作为数据交换格式,所以我使用 Jackson 解析器。我从服务器得到不同的 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"}
]

解析后我得到了 null: {}。这是我使用 Jackson 的代码:

 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);

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

4

4 回答 4

5

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

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

你会得到Listor Map(特别是ArrayListor LinkedHashMap,默认情况下;这些默认值可以更改)。

或者您可以使用以下方法创建 JSON 树JsonNode

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

后者通常更方便。

一件好事是您仍然可以从中创建常规 POJO,例如:

if (root.isObject()) { MyObject ob = objectMapper.treeToValue(MyObject.class); } // 或 with Object, 使用objectMapper.convertValue(ob, MyObject.class)

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

于 2013-03-12T17:02:13.947 回答
4

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

你需要做这样的事情:

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

与这里的答案几乎相同的问题。

于 2013-03-12T16:17:10.280 回答
0

在 JSON 中{"key": "value"}是对象,["this", "that"]是数组。

因此,如果您收到对象数组,您应该使用类似List<Map<Key, Value>>.

于 2013-03-12T16:19:41.340 回答
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);
}
于 2013-03-12T16:24:36.513 回答