Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Json解析提供NullPointerException_Java_Android_Gson - Fatal编程技术网

Java Json解析提供NullPointerException

Java Json解析提供NullPointerException,java,android,gson,Java,Android,Gson,我正在调用此url 和得到一个回应(我删除了很多中间的回应,因为它与问题无关 { "results" : [ { "address_components" : [ { "long_name" : "Towards Wadgao Sheri", "short_name" : "Towards Wadgao Sheri", "types" : [ "

我正在调用此url

和得到一个回应(我删除了很多中间的回应,因为它与问题无关

{
   "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"
}
代码

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

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

编辑:

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

我对json响应进行了一些编辑。请注意。我还试图提取格式化的地址

编辑3:

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

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

从下面Siddharth的评论中

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"));
}
}
你从…开始

JsonObject response = new JsonObject().getAsJsonObject(jsonResults.toString());
这毫无意义。您创建了一个新的空
JsonObject
,然后尝试使用整个JSON字符串作为属性名从中检索元素。因此,yes…
response
null

您的JSON是一个对象。它包含两个字段;
结果
是一个对象数组;
状态
是一个
字符串

通常在使用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());
}  

请再次回顾我的问题,对json的更改和使用的导入的明确提及。我试图让问题非常具体。你能通过检查@done发布一个有效的json吗?我已经添加了一个有效的jsonI使用gson,它没有JSONObject,而是JSONObject。但我想我明白了。我不是像你那样解析它我没有使用任何gson。我只使用jsonobject内置class@Siddharth标题让我感到困惑,我也不读编辑3,同时张贴的答案,也没有看标签GSON。你能考虑使用上述而不是GSON?NOPE我需要使用GSON。让我们做这一点。只需添加下面的答案,以便我可以保持我的问题很清楚。因为你先给了我“解析”的提示,所以我给你这个好处。谢谢。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(“格式化的_地址”).getAsString();@Siddharth如果可行,请编辑我的答案并发布相同的内容。你可以将我的答案放在备选部分。你是对的。我很想接受你的答案。我已经在查看@Raghundan的答案后修复了它。再次感谢。这个答案很好。
/// jsonResuts is a String containing the JSON you list.
JsonObject obj = new JsonParser().parse(jsonResults).getAsJsonObject();
JsonArray resultsArray = obj.getAsJsonArray("results");
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());
}