我正在开发 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);
那么,为什么 Jackson 无法解析它?我该如何解决这个问题?
最佳答案
其他人提出了这个问题,但解决方案有点不完整。如果您需要处理 JSON 对象和数组,您可以绑定(bind)到 java.lang.Object
,检查类型:
Object stuff = objectMapper.readValue(json, Object.class);
您将获得 List
或 Map
(具体来说,默认为 ArrayList
或 LinkedHashMap
;这些默认值可以更改)。
或者你可以用 JsonNode
做 JSON 树:
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)
因此您甚至可以对不同的类型进行不同的处理;来回不同的表示。
关于java - 无法将数组的 JSON 数组解析为 Jackson 中的 LinkedHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15366224/