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

标签 java android json jackson linkedhashmap

我正在开发 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);

您将获得 ListMap(具体来说,默认为 ArrayListLinkedHashMap;这些默认值可以更改)。

或者你可以用 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/

相关文章:

android - 终止设备上的调试

mysql - 使用 MySQL JSON 字段连接表

java - 是否可以在 java 中将 int 归因于 String?

java - 正则表达式匹配没有特定顺序的组

Android 微调器同时显示箭头和选择圆圈?

android - 如何在 Android 的 ListView 上隐藏过滤器弹出窗口?

python - ODS 文件转 JSON

sql - PostgreSQL select * 其中列包含数组值

Java PathIterator顺时针还是逆时针?

java - 如何减少列的宽度并将java中的JTable定位在所需的坐标处