【问题标题】:Gson error: "Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path"Gson 错误:“预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径为 BEGIN_OBJECT”
【发布时间】:2020-07-06 20:37:50
【问题描述】:

当尝试将 json 文本文件解析为餐厅对象的数组列表时,我收到错误“预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径中为 BEGIN_OBJECT。”我很困惑我哪里弄错了,因为我的 Restaurant 类中的数据成员与 json 文件中的字段完全对应。

主要

                List<Restaurant> restaurants = new ArrayList<Restaurant>();

                ......
                fr = new FileReader(filename);
                br = new BufferedReader(fr);
                Gson gson = new Gson();
                TypeToken<List<Restaurant>> token = new TypeToken<List<Restaurant>>() {};
                restaurants = gson.fromJson(br, token.getType());

餐厅类

public class Restaurant {

    public String name;
    public String address;
    public double latitude;
    public double longitude;
    public List<String> menu = new ArrayList<String>();
    //public double distance;
    
    public Restaurant(String name, String address, double latitude, double longitude, List<String> menu) {
        this.name = name;
        this.address = address;
        this.latitude = latitude;
        this.longitude = longitude;
        this.menu = menu;
        //this.distance = 0;
    }

}

txt 文件

{
  "data": [
    {
      "name": "Northern Cafe",
      "address": "2904 S Figueroa Street",
      "latitude": 34.025550,
      "longitude": -118.277440,
      "menu": [
          "orange chicken",
          "rice",
          "noodles",
          "dumplings"
        ]
    },
    {
      "name": "The Lab Gastropub",
      "address": "3500 S Figueroa Street",
      "latitude": 34.019940,
      "longitude": -118.280530,
      "menu": [
          "fried chicken",
          "chicken sandwich",
          "spinach dip",
          "cheeseburger",
          "fries",
          "milkshake"
        ]
    },
    {
      "name": "Taco Bell",
      "address": "3629 S Vermont Ave",
      "latitude": 34.022360,
      "longitude": -118.291850,
      "menu": [
          "chicken taco",
          "beef taco",
          "fries",
          "soda",
          "cheese dipping sauce"
        ]
      
    }
  ]
}

【问题讨论】:

    标签: java gson


    【解决方案1】:

    我认为您的问题是您缺少更高的结构:这可以通过 GSON 期待 BEGIN_ARRAY 但得到 BEGIN_OBJECT 的事实得到证实。前者是[ 令牌,后者是{ 令牌。

    {
      "data": array
    }
    

    这意味着你应该有一个映射:

    class Data {
      List<Restaurant> data;
    }
    

    并使用以下方式阅读:

    TypeToken<Data> token = new TypeToken<Data>() {};
    data = gson.fromJson(br, token.getType());
    

    或者你应该使用适当的API(我不知道,我不使用GSON)先进入数据节点,然后将其值读取为List&lt;Restaurant&gt;

    请注意,new TypeToken&lt;Data&gt;() {} 是一个构造,可能是为了在使用复杂对象(如 ListMap)时捕获泛型,并且您可能会忽略简单类型:

    data = gson.fromJson(br, Data.class);
    

    【讨论】:

    • 感谢您的回复!我按照你的回答得到了错误“Expected BEGIN_OBJECT but was STRING at line 1 column 4 path”,这表明“br”是一个字符串。
    【解决方案2】:

    您正试图反序列化为一组餐厅,但您的文件有一个对象,其中一个字段为 data。将餐厅列表复制到外层应该可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-06
      • 2017-08-26
      • 1970-01-01
      • 2018-05-23
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      相关资源
      最近更新 更多