java - 解析 JSON 对象时 Gson 解析错误

标签 java json gson

我正在尝试解析此 JSON:

{
  "Aatrox": {
    "version": "5.2.1",
    "id": "Aatrox",
    "key": "266",
    "name": "Aatrox",
    "title": "the Darkin Blade"
  },
  "Ahri": {
    "version": "5.2.1",
    "id": "Ahri",
    "key": "103",
    "name": "Ahri",
    "title": "the Nine-Tailed Fox"
  },
  "Akali": {
    "version": "5.2.1",
    "id": "Akali",
    "key": "84",
    "name": "Akali",
    "title": "the Fist of Shadow"
  },
  ....
}

正如您所看到的,所有元素都具有相同的属性,因此我想将它们解析为元素列表,这是我正在使用的类:

public class CampeonBO {

private String version;
private String id;
private String key;
private String name;
private String title;

//Getters and Setters
}

这就是我尝试用 Gson 解析它的方式

Type type = new TypeToken<List<CampeonBO>>(){}.getType();
List<CampeonBO> campeones = gson.fromJson(bufferedReader, type);

我收到错误:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

这显然是因为我的 JSON 中没有数组,我有 3 个属性“Aatrox、Ahri、Akali”,但它们都具有相同的属性,那么我如何使用 Gson 将它们解析为列表?

最佳答案

您告诉 Gson 将数据解析为 List,这意味着 Gson 期望解析 JSON 数组:

JSON Array format

但是您尝试解析的 JSON 实际上是一个 JSON 对象:

JSON Object format

一般来说,Gson 解析 JSON 对象的方法是将其解析为专用的 Java 类型,就像您使用 CampeonBO 所做的那样。然而,JSON 对象在概念上也是一种映射,因此,如果您尝试使用任意键和所有值的类型相同。

一旦您有了 map ,您就可以调用 Map.values()获取 map 值的Collection(如果需要,您可以将其放入List中)。

参见How can I convert JSON to a HashMap using Gson?举一些例子。

图片来自http://json.org/ .

关于java - 解析 JSON 对象时 Gson 解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28796145/

相关文章:

java - 将 EditText 存储在数组中并显示在 TextView 中

java - 嵌套 JSON 的问题

java.lang.OutOfMemoryError : Java heap space when try to convert Java Object to Json String 错误

java - 重复调用终端命令的最佳方式

java - 如何生成 UTC 格式的 java.sql.Timestamp 用于查询比较?

JavaScript:比较两个 JSON 对象的结构,同时忽略它们的值

javascript - 最安全的 JavaScript JSON 内联技术

java - 在 Spring 中使用 postForEntity 时错误的 POST 正文 JSON 序列化

java - JAVA中解析googleapi地址时出错

java - 如何在鼠标右键单击时禁用 JSlider 的位置更改