【问题标题】:Android JSon error "Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2"Android JSON 错误“预期为 BEGIN_OBJECT,但在第 1 行第 2 列是 BEGIN_ARRAY”
【发布时间】:2012-03-15 13:31:01
【问题描述】:

我从 Web 服务获取 JSon 数据,示例数据如下:

[
  {
    "SectionId": 1,
    "SectionName": "Android"
  }
]

当我尝试转换它时,它会抛出一个错误,我这样做是:

Data data = new Gson().fromJson(jsonDataFromWebService, Data.class);

我的科类是:

class Section
{
    public int SectionId;
    public String SectionName;
}

class Data {
    public List<Section> sections;
}

LogCat 说:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为 BEGIN_OBJECT,但在第 1 行第 2 列是 BEGIN_ARRAY

【问题讨论】:

    标签: android json illegalstateexception


    【解决方案1】:

    这个错误解释了什么是错误的......你返回一个数组而不是一个 JSon 对象

    尝试如下:

    JSONArray ja = new JSONArray(jsonStringReturnedByService);
    
    Data sections = new Data();
    
    for (int i = 0; i < ja.length(); i++) {
        Section s = new Section();
        JSONObject jsonSection = ja.getJSONObject(i);
    
        s.SectionId = Integer.ValueOf(jsonSection.getString("SectionId"));
        s.SectionName = jsonSection.getString("SectionName");
    
       //add it to sections list
       sections.add(s);
    }
    
    return sections;
    

    【讨论】:

    • 这是一个糟糕的答案。改变 API 返回数据的方式并不总是一种选择。
    【解决方案2】:

    您正在尝试从 JSONArray 创建一个非数组(集合)对象。错误很明显:GSON 期待一个对象的开头,但却找到了一个数组的开头。

    查看下面的文档页面,了解如何使用 GSON 使用 Array 和 Collection 类型

    https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples

    来自文档:

    数组示例

    Gson gson = new Gson();整数 [] 整数 = {1, 2, 3, 4, 5};字符串 [] 字符串 = {"abc", "def", "ghi"};

    (序列化) gson.toJson(ints); ==> 打印 [1,2,3,4,5] gson.toJson(字符串); ==> 打印 ["abc", "def", "ghi"]

    (反序列化) int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class); ==> ints2 将与 ints 相同

    我们还支持多维数组,任意复杂 元素类型 集合示例

    Gson gson = new Gson();集合整数 = Lists.immutableList(1,2,3,4,5);

    (序列化) String json = gson.toJson(ints); ==> json 是 [1,2,3,4,5]

    (反序列化)类型 collectionType = new TypeToken>(){}.getType();收藏 ints2 = gson.fromJson(json, collectionType); ints2 与 ints 相同

    相当可怕:注意我们如何定义集合的类型 不幸的是,没有办法在 Java 中解决这个问题

    集合限制

    可以序列化任意对象的集合但不能反序列化 从它因为没有办法让用户指示类型 结果对象反序列化时,Collection 必须是 特定的泛型类型所有这些都是有道理的,而且很少成为问题 如果遵循良好的 Java 编码实践

    【讨论】:

      【解决方案3】:

      仅按如下方式使用 Section 类:

      Section[] sectionArray = new Gson().fromJson(jsonDataFromWebService, Section[].class);
      for (Section section: sectionArray) {
           Log.e("Debug", section.toString());
      }
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多