【问题标题】:Json parsing gives NullPointerExceptionJson 解析给出 NullPointerException
【发布时间】:2013-06-23 12:35:41
【问题描述】:

我正在调用这个网址

http://maps.googleapis.com/maps/api/geocode/json?latlng=18.550455,73.920148&sensor=true

并得到回复(我从中间删除了很多回复,因为它与问题无关。

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Towards Wadgao Sheri",
               "short_name" : "Towards Wadgao Sheri",
               "types" : [ "route" ]
            },
            {
               "long_name" : "411014",
               "short_name" : "411014",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Towards Wadgao Sheri, Sainikwadi, Wadgaon Sheri, Pune, Maharashtra 411014, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 18.55131630,
                  "lng" : 73.91882219999999
               },
               "southwest" : {
                  "lat" : 18.55024130,
                  "lng" : 73.91866569999999
               }
            },
            "location" : {
               "lat" : 18.55077720,
               "lng" : 73.91878240
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 18.55212778029150,
                  "lng" : 73.92009293029150
               },
               "southwest" : {
                  "lat" : 18.54942981970850,
                  "lng" : 73.91739496970848
               }
            }
         },
         "types" : [ "route" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Sainikwadi",
               "short_name" : "Sainikwadi",
               "types" : [ "neighborhood", "political" ]
            },
            {
               "long_name" : "411014",
               "short_name" : "411014",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Sainikwadi, Wadgaon Sheri, Pune, Maharashtra 411014, India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 18.5551140,
                  "lng" : 73.92143690
               },
               "southwest" : {
                  "lat" : 18.5465270,
                  "lng" : 73.91406809999999
               }
            },
            "location" : {
               "lat" : 18.55092520,
               "lng" : 73.91687659999999
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 18.5551140,
                  "lng" : 73.92143690
               },
               "southwest" : {
                  "lat" : 18.5465270,
                  "lng" : 73.91406809999999
               }
            }
         },
         "types" : [ "neighborhood", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "India",
               "short_name" : "IN",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "India",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.50447520,
                  "lng" : 97.3955550
               },
               "southwest" : {
                  "lat" : 6.747138899999999,
                  "lng" : 68.16238590
               }
            },
            "location" : {
               "lat" : 20.5936840,
               "lng" : 78.962880
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.50447520,
                  "lng" : 97.3955550
               },
               "southwest" : {
                  "lat" : 6.747138899999999,
                  "lng" : 68.16279560
               }
            }
         },
         "types" : [ "country", "political" ]
      }
   ],
   "status" : "OK"
}

代码

        JsonObject response = new JsonObject().getAsJsonObject(jsonResults.toString());
>>>NPE  JsonArray results = response.getAsJsonArray("results");

来自 json 的响应在 jsonResults 中。我在第二行得到一个 NPE

我猜响应是空的,我想知道为什么,这里做错了什么?刚刚从响应 json 中创建了一个 json 对象。我知道我在这里遗漏了一些非常愚蠢的东西。

编辑:

Exception in thread "Thread-0" java.lang.NullPointerException
    at com.mcruiseon.ivr.God.getGeoAddress(God.java:141)

编辑 2:

我稍微编辑了 json 响应。请注意。我也在尝试提取 formatted_address

编辑 3:

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

【问题讨论】:

  • 请再次查看我的问题,更改 json 并明确提及使用的导入。我试图让这个问题非常具体
  • 你能通过检查@jsonlint.com发布一个有效的json吗
  • 完成,我添加了一个有效的json

标签: java android gson


【解决方案1】:

答案的关键:Gson与否,解析json字符串是答案的关键。

来自下面 Siddharth 的 cmets。

JsonParser parser = new JsonParser();
JsonObject json = parser.parse(jsonResults.toString()).getAsJsonObject() ; 
JsonArray results = json.getAsJsonArray("results");
JsonObject result = results.get(0).getAsJsonObject(); 
customerAddress = result.get("formatted_address").getAsString(); 

替代方案:

我未能阅读问题的编辑 3 部分,也未能查看 gson 标签。所以我最终提供了以下替代方案。

JSONObject jsono = new JSONObject (myjsonstring);
JSONArray myListsAll= new JSONArray(jsono.getString("results"));
for(int i=0;i<myListsAll.length();i++){
JSONObject jsonObject1 = (JSONObject) myListsAll.get(i);
JSONArray myarray= new JSONArray(jsonObject1.getString("address_components"));
for(int i1=0;i1<myarray.length();i1++)
{
JSONObject jsonobject2 =  myarray.getJSONObject(i1);                     
System.out.println(""+jsonobject2.getString("long_name"));                  
System.out.println(""+jsonobject2.getString("short_name"));
System.out.println(""+jsonobject2.getString("types"));
}
}

输出

Towards Wadgao Sheri
Towards Wadgao Sheri
["route"]
Sainikwadi
Sainikwadi
["neighborhood","political"]
Wadgaon Sheri
Wadgaon Sheri
["sublocality","political"]
Pune
Pune
 ["locality","political"]
 Pune
 Pune
 ["administrative_area_level_2","political"]
Maharashtra
MH
["administrative_area_level_1","political"]
India
IN
["country","political"]
411014
411014
["postal_code"]
 Sainikwadi
 Sainikwadi
 ["neighborhood","political"]
 Wadgaon Sheri
 Wadgaon Sheri
 ["sublocality","political"]
 Pune
 Pune
 ["locality","political"]
 Pune
 Pune
 ["administrative_area_level_2","political"]
 Maharashtra
 MH
 ["administrative_area_level_1","political"]
 India
 IN
 ["country","political"]
 411014
 411014
 ["postal_code"]
 Wadgaon Sheri
 Wadgaon Sheri
 ["sublocality","political"]
 Pune
 Pune
 ["locality","political"]
 Pune
 Pune
 ["administrative_area_level_2","political"]
 Maharashtra
 MH
 ["administrative_area_level_1","political"]
 India
 IN
 ["country","political"]
 411014
 411014
 ["postal_code"]
 Pune
 Pune
 ["administrative_area_level_2","political"]
 Maharashtra
 MH
 ["administrative_area_level_1","political"]
 India
 IN
 ["country","political"]
 Pune
 Pune
 ["locality","political"]
 Pune
 Pune
 ["administrative_area_level_2","political"]
 Maharashtra
 MH
 ["administrative_area_level_1","political"]
 India
 IN
 ["country","political"]
 Pune
 Pune
 ["administrative_area_level_2","political"]
 Maharashtra
 MH
 ["administrative_area_level_1","political"]
 India
 IN
 ["country","political"]
 Maharashtra
 MH
 ["administrative_area_level_1","political"]
 India
 IN
 ["country","political"]
 India
 IN
 ["country","political"]

【讨论】:

  • 我用的是gson,它没有JSONObject,而是有JsonObject。但我想我明白了。我不像你那样parsing
  • 我没有使用任何 gson。我只在类中使用 jsonobject 构建
  • @Siddharth 标题让我感到困惑,而且我在发布答案时没有阅读编辑 3,也没有查看标签 gson。你可以考虑用上面的代替 gson 吗?
  • 不,我需要使用 gson。让我们改为这样做。只需将以下内容添加到您的答案中,这样我就可以保持我的问题干净。我给你这个好处,因为你给了我先“解析”的提示。谢谢。 JsonParser 解析器 = 新的 JsonParser(); JsonObject json = parser.parse(jsonResults.toString()).getAsJsonObject() ; JsonArray 结果 = json.getAsJsonArray("results"); JsonObject 结果 = results.get(0).getAsJsonObject(); customerAddress = result.get("formatted_address").getAsString();
  • @Siddharth 如果可行,请编辑我的答案并发布相同的内容。你可以把我的答案放在替代部分。
【解决方案2】:

你从...开始

JsonObject response = new JsonObject().getAsJsonObject(jsonResults.toString());

这毫无意义。您创建了一个新的空 JsonObject,然后尝试使用整个 JSON 字符串作为属性名称从中检索一个元素。因此,是的……responsenull

您的 JSON 是一个对象。它包含两个字段; results 是一个对象数组,status 是一个 String

通常在使用 Gson 时,您会创建匹配的 Java 类并使用 Gson 实例对它们进行反序列化。如果您不想这样做,那么您可以使用 Gson 的 JsonParser 来解析 Json,然后通过各种 Json* 类访问它:

/// jsonResuts is a String containing the JSON you list.
JsonObject obj = new JsonParser().parse(jsonResults).getAsJsonObject();
JsonArray resultsArray = obj.getAsJsonArray("results");

现在您有了对象数组,并且可以使用我上面使用的 Gson 中相同的方法/类来更深入地研究它。

for (JsonElement e : resultsArray) {
    JsonObject resultsObj = e.getAsJsonObject();
    JsonElement formattedAddress = resultsObject.get("formatted_address");
    String addressAsString = formattedAddress.getAsString();
    System.out.println(addressAsString);
    // The above can be chained and reduced to one line:
    // System.out.println(e.getAsJsonObject().get("formatted_address").getAsString());
}  

【讨论】:

  • 你是对的。我很想接受你的回答。在查看@Raghunandan 的答案后,我已经修复了它。再次感谢。这个答案很好。
猜你喜欢
  • 2014-03-06
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多