【问题标题】:Read JSON error: org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]读取 JSON 错误:org.json.JSONException:JSONObject 文本必须以 '{' 在 1 [字符 2 第 1 行] 开头
【发布时间】:2018-08-03 02:14:08
【问题描述】:

正如您在标题中看到的,当我尝试读取 Riot-Games API 上提供的 JSON 文件时出现错误。我尝试使用其 SummonerID 返回用户的当前等级和等级。当我尝试获取 SummonerID 时,我没有收到此错误。 我想问题在于 JSON 文件以“[”和“]”开头和结尾。因此,我正在寻找如何提取其中某些部分的解决方案(例如:等级、排名和联赛积分)。

这就是我收到召唤者ID的方式:

public static String getSummonerID(String summoner) throws IOException, JSONException {
    JSONObject json = readJsonFromUrl("https://euw1.api.riotgames.com/lol/summoner/v3/summoners/by-name/" + summoner +"?api_key="+ api_key);
    return json.get("id").toString();
}

这是我尝试接收当前层级信息的方式:

public static String getSummonerTierSoloQ(String summoner) throws IOException, JSONException {
    JSONObject json = readJsonFromUrl("https://euw1.api.riotgames.com/lol/league/v3/positions/by-summoner/" + getSummonerID(summoner) +"?api_key="+ api_key);
    return json.toString();
}

要获取的 JSON 文件如下所示:

[
    {
        "leagueId": "",
        "leagueName": "Soraka's Mercenaries",
        "tier": "SILVER",
        "queueType": "RANKED_SOLO_5x5",
        "rank": "III",
        "playerOrTeamId": "",
        "playerOrTeamName": "JieBäf",
        "leaguePoints": 58,
        "wins": 142,
        "losses": 134,
        "veteran": true,
        "inactive": false,
        "freshBlood": false,
        "hotStreak": false
    },
    {
        "leagueId": "",
        "leagueName": "Sion's Marksmen",
        "tier": "SILVER",
        "queueType": "RANKED_FLEX_SR",
        "rank": "IV",
        "playerOrTeamId": "",
        "playerOrTeamName": "JieBäf",
        "leaguePoints": 23,
        "wins": 96,
        "losses": 98,
        "veteran": true,
        "inactive": false,
        "freshBlood": false,
        "hotStreak": false
    }
]

准确的错误代码是:

org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
        at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
        at org.json.JSONObject.<init>(JSONObject.java:183)
        at org.json.JSONObject.<init>(JSONObject.java:309)
        at dev.reader.JsonReader.readJsonFromUrl(JsonReader.java:33)
        at dev.reader.JsonReader.getSummonerTierSoloQ(JsonReader.java:56)
        at dev.reader.JsonReader.output(JsonReader.java:45)
        at dev.main.Load.main(Load.java:15)

差点忘了 readJsonFromURL 和 readAll 方法:

public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try {
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
      String jsonText = readAll(rd);
      JSONObject json = new JSONObject(jsonText);
      return json;
    } finally {
      is.close();
    }
}

private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
        sb.append((char) cp);
    }
    return sb.toString();
}

感谢您的所有帮助:D

JieBäf |芬兰人

使用的代码来自 stackoverflow,而不是我,但似乎没有像预期的那样完美。

【问题讨论】:

  • 寻找解决方案:步骤 1) 学习 JSON。我的意思是,来吧,语法非常简单,可以在一个页面上描述:json.org。 --- 然后:步骤 2) 意识到 [ 是 JSON Array 的开头。 --- 步骤 3) 阅读您正在使用的 JSON 库的documentation。当你这样做时,你会意识到 JSONArray 类可能比 JSONObject 更适合解析 JSON 数组。
  • 我刚刚搜索了一个快速的解决方案,当我用谷歌搜索时,弹出的第一个 stackoverflow 链接就是我目前正在使用的那个。我想这不会那么容易,我会尝试你建议我做的事情。我从来没有使用过 JSON,所以我不知道它是什么,除了它类似于多维列表
  • 阅读我给的link中的第一句话:“JSON(JavaScript Object Notation)是一种轻量级的数据交换格式”。它不是一个“多维列表”。

标签: java bots teamspeak riot-games-api


【解决方案1】:

您试图读取的是包含在“json 数组”中的两个“json 对象”。我不熟悉您正在使用的库(我更喜欢 Jackson),但应该有一种方法可以将此字符串读取为 json arraythen 检索这两个json 对象。

【讨论】:

  • 谢谢,我会搜索一个好的文档/教程并尝试理解它!
【解决方案2】:

我不确定您的问题是否已解决。当我第一次开始使用 JSON 时,我遇到了同样的错误。在这里发布我的答案,这样如果其他人最终在这里寻找答案,可以很容易地找到它。当您没有将正确的参数传递给正确的 get 函数调用时,就会出现此错误。我们实际上必须一步一步地进入。首先,我们需要访问根对象,然后我们必须获取所需的 JSON Array。一旦我们有了 JSONArray,我们就可以调用 get(i),然后我们可以调用 getString(param) 或 getInt(param)。

我已经创建了示例项目。第一个用于创建 JSON 对象,第二个用于 JSON 解析。

创建 JSON 对象:https://github.com/vikram-bhardwaj/RestServer_Mar2022 解析 JSON 文件:https://github.com/vikram-bhardwaj/RestClient_Mar2022

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 2017-06-06
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多