当前位置: 首页 > 知识库问答 >
问题:

gson错误:“预期BEGIN_ARRAY但BEGIN_OBJECT在第1行第2列路径”

裴永年
2023-03-14

在尝试将json文本文件解析为餐厅对象的数组列表时,我遇到了错误“应为BEGIN\u数组,但在第1行第2列路径处为BEGIN\u对象。”我不知道哪里弄错了,因为我的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"
        ]
      
    }
  ]
}

共有2个答案

万明辉
2023-03-14

您正试图反序列化到一个餐厅数组中,但您的文件有一个对象,只有一个字段<代码>数据 。将餐厅列表复制到外部级别应该可以解决您的问题。

胡璞瑜
2023-03-14

我认为您的问题是缺少了更高的结构:这一点可以通过以下事实得到证实:GSON需要一个BEGIN\u数组,但得到了一个BEGIN\u对象。前者是令牌,后者是令牌。

{
  "data": array
}

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

class Data {
  List<Restaurant> data;
}

并使用以下方法阅读:

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

或者您应该首先使用适当的API(我不知道,我不使用GSON)进入数据节点,然后读取其值作为列表

请注意,新的TypeToken

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

 类似资料:
  • 问题内容: 我遇到错误了。 由于以下原因,无法解析JSON:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_ARRAY,但在第1行第2列为BEGIN_OBJECT 服务器网址 执行请求 上课后 我该如何解决? 问题答案: 您在注释中声明返回的JSON是这样的: 您告诉Gson您有一个对象数组:

  • 问题内容: 我从Web服务获取JSon数据,示例数据如下: 当我尝试将其转换时,它将引发错误,我这样做是: 我的班级是: LogCat说: com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT,但在第1行第2列为BEGIN_ARRAY 问题答案: 错误说明发生了什么问题…您返回的是数组

  • 问题内容: 我知道这不是第一次有人问这个问题,但是有了Retrofit2,我找不到适合我问题的正确解决方案。我遵循了在线教程,效果很好。当我将相同的代码应用于自己的端点时,会出现以下异常:我不知道该如何解决。 接口: 客户代码: 此代码与此有效负载一起使用: 但与此不: 我的音乐课: 问题答案: 当您说“此代码正在使用此有效负载:…而不是与此有效:: …”时,这是预期的,这就是假定的工作方式。实际

  • 我有一个应用程序,它正在查询一个endpoint,然后简单地将响应放在ListView中。然而,“onFailure”返回消息“预期BEGIN_ARRAY但BEGIN_OBJECT第1行第2列路径$”。 我看过类似的问题,但似乎无法在我的应用程序中找到答案。 在OnCread中,我设置了endpoint的基本URL,然后添加了我的API密钥,并调用了一个接口,该接口查询必要的参数: 下面是查询的界

  • 我是android编程新手。我有一个类,在这个类中,修改API调用是为了解析和显示JSON文件中的几个属性。但我得到: Java语言lang.IllegalStateException:应为BEGIN\u对象,但在第2行第1列为字符串 好心帮忙。我搜索了答案,但没有发现JSON响应有任何问题。发布了我的JSON响应和JAVA类: JSON响应: JAVA文件: 模型类: