JsonReader 抛出 IllegalStateException
Posted
技术标签:
【中文标题】JsonReader 抛出 IllegalStateException【英文标题】:JsonReader throwing IllegalStateException 【发布时间】:2015-11-23 13:26:10 【问题描述】:我发现使用http://ip-api.com/json
是获取必要用户位置详细信息的一种简单方法。结果,例如来自网站的结果是:
"as":"AS37061 ONECOM","city":"Nairobi","country":"Kenya","countryCode":"KE","isp":"One Communications Ltd","lat":-1.2833,"lon":36.8167,"org":"ONECOM","query":"41.203.219.198","region":"110","regionName":"Nairobi Province","status":"success","timezone":"Africa/Nairobi","zip":""
我一直在用下面的代码解析上面的Json结果:
String countryCode = null;
String name = null;
if (reader != null)
try
reader.setLenient(true);
reader.beginObject();
while (reader.hasNext())
switch (reader.nextName())
case "countryCode":
countryCode = reader.nextString().toLowerCase();
break;
case "country":
name = reader.nextString();
break;
default:
reader.skipValue();
break;
reader.endObject();
catch (IOException e)
e.printStackTrace();
现在我收到此错误:
Fatal Exception: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was END_DOCUMENT at line 1 column 2016
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
at com.radioafrica.music.fragment.TopTracks.getCountryCode(TopTracks.java:397)
at com.radioafrica.music.fragment.TopTracks.access$1100(TopTracks.java:57)
at com.radioafrica.music.fragment.TopTracks$9.run(TopTracks.java:377)
at java.lang.Thread.run(Thread.java:818)
据我所知,代码没问题,但并不总是有效。似乎是什么问题?
【问题讨论】:
【参考方案1】:我认为有两个问题:您忘记了代码中的某些内容,以及您解析 JSON 的方式:
-
您的代码似乎没有检查
reader
是否包含空字符串。 (当 IP-API 返回错误答案或什么都不返回时,可能会发生这种情况。
奖励点:您不应该自己处理这个低级问题。实际上,很多非常轻量级且极其可靠的库会为您完成 JSON 解析。它将处理此类问题并为您提供明确的异常。您可以尝试 Gson 或其他更适合您需求的东西。
【讨论】:
让我切换到使用 Gson 并检查它是否性能更好。以上是关于JsonReader 抛出 IllegalStateException的主要内容,如果未能解决你的问题,请参考以下文章
从 JsonReader 读取 JObject 时出错。当前 JsonReader 项不是对象:StartArray。小路
使用 JsonReader 将缓存的 Json 文件读取为 ByteArray