使用 GSON 解析来自 Google Directions API 的数据

问题描述 投票:0回答:1

我的 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"
}

我需要的值是-

  1. 距离下 - (文本:22.7 公里)
  2. 持续时间 - (文本:56 分钟)
  3. 结束地址。

为了简单起见,我从“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,以防万一。

如果尝试从 -

获得结果
  1. directionsApiResponse.getLegsList().toString()
  2. directionsApiResponseList.get(0).getLegsList().get(0).getEnd_address()

它抛出“NullPointerException”。我可以清楚地看到“routes”是一个数组,它在位置 0 处有 1 个元素,“legs”在位置 0 处也有 1 个元素。

问题-

  1. 我做错了什么?
  2. Google 是否有任何书面代码来解析 Directions API 的 JSON 响应,我可以在其中删除我不需要的 GSON 元素?
java android gson google-directions-api jsonobjectrequest
1个回答
0
投票

您遇到的

NullPointerException
是由于JSON响应和类中的键之间的差异造成的。在 JSON 响应中,键被命名为
legs
,但是,在类中,您将其命名为
legsList
。您可以使用两种方法解决这个问题。两者都很简单。

方式一(课堂改名):

只需将名称

legsList
更改为
legs
即可开始。

方式2(使用
@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 响应。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.