2015-11-23 88 views
1

我发现使用http://ip-api.com/json是获取必要用户位置详细信息的简单方法。结果,例如从该网站是:JsonReader抛出IllegalStateException

{"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解析的方式:

  1. 你的代码似乎不检查reader不包含空字符串。 (当ip-api返回错误答案或者什么都没有时可能发生)。
  2. 红利点:你不应该自己处理这个低级别的问题。实际上,很多非常轻量且非常可靠的库将为您执行JSON解析。它会处理这类问题并给你明确的例外。你可以尝试Gson或antyhing其他,这将符合您的需求下注。
+0

让我切换到使用Gson并检查它是否表现更好。 –

+0

没有更多的回复,我希望它对你有帮助;) – mithrop

+0

我切换到Gson,它的工作。谢谢!! –

相关问题