Ошибка чтения JSON: org.json.JSONException: текст JSONObject должен начинаться с '{' с 1 [символ 2, строка 1]
Как вы можете видеть из названия, я получаю сообщение об ошибке при попытке прочитать файл JSON, который доступен в Riot-Games API. Я пытаюсь вернуть текущий уровень и рейтинг пользователя, используя его summonerID. Я не получаю эту ошибку, когда пытаюсь получить summonerID. Я предполагаю, что проблема в том, что файл JSON начинается и заканчивается на "[" и "]". Поэтому я ищу решение о том, как извлечь некоторые его части (например, tier, rank и leaguePoints).
Вот как я получаю summonerID:
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 | финн
Используемый код взят из stackru и не мной, но, похоже, работает не так идеально, как предполагалось.
2 ответа
То, что вы пытаетесь прочитать, - это два "объекта json", содержащиеся в "массиве json". Я не знаком с библиотекой, которую вы используете (я предпочитаю Джексона), но должен быть способ прочитать эту строку как массив json, а затем извлечь из него два объекта json.
Я не уверен, что ваша проблема была решена. Когда я впервые начал использовать JSON, я столкнулся с той же ошибкой. Публикую мой ответ здесь, чтобы, если кто-то еще оказался здесь в поисках ответа, он мог легко его найти. Эта ошибка возникает, когда вы не передаете правильные параметры для правильного вызова функции get. На самом деле нам нужно идти шаг за шагом. Сначала нам нужно получить доступ к корневому объекту, а затем мы должны получить желаемый массив JSON. Когда у нас есть 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
Надеюсь, это помогло.