我的 API 响应是这样的 -
{
"geocoded_waypoints": [],
"routes": [
{
"bounds": {},
"copyrights": "Map data ©2024",
"legs": [
{
"distance": {
"text": "22.7 km",
"value": 22733
},
"duration": {
"text": "56 mins",
"value": 3358
},
"end_address": "B-14, opp. Defence Colony, near Lajpat Nagar Metro Station, Block A, Lajpat Nagar II, Lajpat Nagar, New Delhi, Delhi 110024, India",
"end_location": {},
"start_address": "C5M9+9XG, Southend Dr, Dera Village, Dera Mandi, New Delhi, Delhi 110074, India",
"start_location": {},
"steps": [],
"traffic_speed_entry": [],
"via_waypoint": []
}
],
"overview_polyline": {},
"summary": "SSN Marg",
"warnings": [],
"waypoint_order": []
}
],
"status": "OK"
}
我需要的值是-
为了简单起见,我从“routes”获取了 JSONArray 响应。
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("routes");
Type collectionType = new TypeToken<List<DirectionsApiResponse>>(){}.getType();
List<DirectionsApiResponse> directionsApiResponseList =
new Gson().fromJson(jsonArray.toString(), collectionType);
Log.d("ABCDE", directionsApiResponseList.get(0).getLegsList().get(0).getEnd_address());
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(jsonObjectRequest);
这是使用 GSON 的 DirectionsApiResponse 类 -
import java.util.List;
public class DirectionsApiResponse {
private List<legs> legsList;
public List<legs> getLegsList() {
return legsList;
}
public void setLegsList(List<legs> legsList) {
this.legsList = legsList;
}
}
class legs {
private distance distance;
private duration duration;
private String end_address;
public distance getDistance() {
return distance;
}
public void setDistance(distance distance) {
this.distance = distance;
}
public duration getDuration() {
return duration;
}
public void setDuration(duration duration) {
this.duration = duration;
}
public String getEnd_address() {
return end_address;
}
public void setEnd_address(String end_address) {
this.end_address = end_address;
}
}
class distance {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
class duration {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
我为所有人创建了 getter 和 setter,以防万一。
如果尝试从 -
获得结果它抛出“NullPointerException”。我可以清楚地看到“routes”是一个数组,它在位置 0 处有 1 个元素,“legs”在位置 0 处也有 1 个元素。
问题-
您遇到的
NullPointerException
是由于JSON响应和类中的键之间的差异造成的。在 JSON 响应中,键被命名为 legs
,但是,在类中,您将其命名为 legsList
。您可以使用两种方法解决这个问题。两者都很简单。
只需将名称
legsList
更改为 legs
即可开始。
@SerializedName
注释)(更可取):您可以使用
@SerializedName
注释将 JSON 字段正确映射到 Java 对象字段。如果您明确想要将字段命名为 legsList
,但希望将其正确映射到 legs
,则可以使用此方法。
实施示例:
public class DirectionsApiResponse {
@SerializedName("legs") // This ensures that 'leg' field is mapped with 'legsList'
private List<Legs> legsList;
public List<Legs> getLegsList() {
return legsList;
}
public void setLegsList(List<Legs> legsList) {
this.legsList = legsList;
}
}
现在,对于你的第二个问题, 据我所知,没有任何 Google 代码可以解析响应并返回相应的类。因此,我认为您将不得不继续使用 GSON 来解析 API 响应。
希望这有帮助。