无法将JSON数组数组解析为Jackson中的LinkedHashMap

Mai*_*r00 2 java android json linkedhashmap jackson

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

{"user_id":"332","user_role":"1"} 
Run Code Online (Sandbox Code Playgroud)

或者是其他东西.所有这些我解析的东西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"}
]
Run Code Online (Sandbox Code Playgroud)

我解析后得到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);
Run Code Online (Sandbox Code Playgroud)

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

Sta*_*Man 5

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

Object stuff = objectMapper.readValue(json, Object.class);
Run Code Online (Sandbox Code Playgroud)

并且你会得到List或者Map(具体地,ArrayList或者LinkedHashMap,默认情况下;这些默认值可以更改).

或者您可以使用以下命令执行JSON树JsonNode:

JsonNode root = objectMapper.readTree(json);
if (root.isObject()) { // JSON Object
} else if (root.isArray()) { ...
}
Run Code Online (Sandbox Code Playgroud)

后者往往更方便.

一个好处是你仍然可以从这些中创建常规POJO,例如:

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

所以你甚至可以针对不同类型进行不同的处理; 来回不同的表现形式.