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