【问题标题】:Error: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $错误:应为 BEGIN_ARRAY,但在第 1 行第 1 列路径 $
【发布时间】:2019-01-08 06:43:52
【问题描述】:

我正在尝试解析如下所示的 JSON 文件:

[
    {"character": "㐭", "definition": "blabla", "pinyin": ["lin"]},
    // some more 
    {"character": "㐱", "definition": "blabla", "pinyin": ["zhen"]}
]

附:我在 json 文件中没有 // some more

位于 res/raw/dictionary.json 文件夹中。但我得到了异常Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $。我得到这样的数据:

InputStream is = getResources().openRawResource(R.id.dictionary);
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
    Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    int n;
    while((n = reader.read(buffer)) != -1) {
        writer.write(buffer, 0, n);
    }
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    finish(); // For now just finishing activity, gonna add handling later
} catch (IOException e) {
    e.printStackTrace();
    finish();
} finally {
    try {
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
        finish();
    }
}
String json = writer.toString();
JSONArray dictionary = new JSONArray(json);
// Do stuff with Array

首先我认为错误是由于我用来解析 json 的方式而出现的,但是当我注释掉然后删除所有解析机制时,它仍然向我显示了这个错误。似乎在android加载资源时会发生这种情况,但我不确定。我尝试将 json 修改为以下内容:

{
  "characters": [
      {"character": "㐭", "definition": "blabla", "pinyin": ["lin"]},
      // some more
      {"character": "㐱", "definition": "blabla", "pinyin": ["zhen"]}
  ]
}

并改变解析机制

// Get resources
String json = writer.toString();
JSONObject dictionaryObj = new JSONObject(json);
JSONArray dictionary = dictionaryObj.getJSONArray("characters");

但这也无济于事。这里有什么问题?

注意:问题是我什至无法测试任何解决方案,因为未加载活动,错误出现在 gradle build 期间,在“运行任务”部分

【问题讨论】:

  • 错误的是你试图将它作为JSONObject 作为根对象接收,而它是JSONArray
  • @JeelVankhede,对不起,我现在要编辑,当我修改 JSON 以使用上一个代码 sn-p 中的对象时,我复制了代码。首先我尝试接收数组
  • @JeelVankhede,啊不,我写的一切都是正确的,我试图先将它作为 JSONArray 接收,然后更改为 JSONObject
  • 分享你的Json解析代码
  • @Anmol,我现在把它添加到帖子中

标签: java android json gson


【解决方案1】:

您需要将其解析为 JSONArray 以获取以下数据:

[
    {"character": "㐭", "definition": "blabla", "pinyin": ["lin"]},
    // some more 
    {"character": "㐱", "definition": "blabla", "pinyin": ["zhen"]}
]

对于上述类型的数据,解析将是:

// Get resources
String json = writer.toString();
JSONArray arr = new JSONArray(json);
// Then parse your objects like below
for (int i=0; i < arr.length(); i++) {
    JSONObject character = arr.getJSONObject(i); // this will provide you all json objects to be parse.
}

【讨论】:

  • 其实我就是这么干的,但是不行,就是这个问题
  • 不,您首先将JSONObject 作为root 用户,这不是必需的。直接以JSONArray接收。
  • 检查第一个java代码sn-p,我收到JSONArray
  • 如果你直接将 writer 提供给 array 而不需要任何中介怎么办?即new JSONArray(writer.toString())
【解决方案2】:
   {
      "characters": [
          {"character": "㐭", "definition": "blabla", "pinyin": ["lin"]},
          // some more
          {"character": "㐱", "definition": "blabla", "pinyin": ["zhen"]}
      ]
    }

对于上面的Json

JSONObject json = new JSONObject(writter.toString());
String characters = json.getString("characters");
JSONArray array = new JSONArray(characters);
for (int i=0; i < array.length(); i++) {
    JSONObject element = array.getJSONObject(i); 
}

试试这个

【讨论】:

  • 我写了这段代码,但我无法检查它是否有效,因为活动甚至没有启动,在gradle构建期间出现错误,它显示在“运行任务”中
  • 清理项目并重建然后运行它
【解决方案3】:

好的,所以问题不在于 JSON 解析机制,而在于我通过重启项目修复的 Android Studio 错误。

【讨论】:

    【解决方案4】:

    Json 应该是:(我删除了// some more

    {
      "characters": [
          {"character": "㐭", "definition": "blabla", "pinyin": ["lin"]},
          {"character": "㐱", "definition": "blabla", "pinyin": ["zhen"]}
      ]
    }
    

    【讨论】:

    • 我在 json 文件中没有// some more,我在帖子中添加了这条评论,告诉我们不仅有 2 个条目
    • 您也应该将getJSONArray 用于pinyin 属性。
    • 我以后用它,关键是它不会解析整个文件
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多