反序列化谷歌方向 json 时出错



我有这个json

https://maps.googleapis.com/maps/api/directions/json?origin=-22.8895625,-47.0714089&destination=-22.892376,-47.027553&key=

我需要反序列化它 但是我收到此错误

读取完 JSON 内容后遇到的其他文本:,。路径 '',第 8 行,位置 4。

我在做什么:

public static async Task<List<Model.Localizacao>> GetDirectionsAsync(Localizacao locUser, Localizacao locLoja)
{
using (var client = new HttpClient())
{
try
{
List<Model.Localizacao> lstLoc = new List<Model.Localizacao>();
var json = await client.GetStringAsync("https://maps.googleapis.com/maps/api/directions/json?origin=" + locUser.latitude + "," + locUser.longitude + "&destination="+ locLoja.latitude+","+locLoja.longitude+"&key=" + GOOGLEMAPSKEY);
json = json.Substring(json.IndexOf('['));
json = json.Substring(0, json.LastIndexOf(']') + 1);
lstLoc = JsonConvert.DeserializeObject<List<Model.Localizacao>>(json);
return lstLoc;
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
return null;
}
}
}

这是我的班级:

namespace neoFly_Montana.Model
{
class Localizacao
{
public double latitude { get; set; }
public double longitude { get; set; }
}
}

我该如何解决这个问题? 我的密钥与谷歌地图相同

我相信问题出在这些行上:

json = json.Substring(json.IndexOf('['));
json = json.Substring(0, json.LastIndexOf(']') + 1);

这似乎将json设置为从第一个[到最后一个]的所有文本。这意味着你最终会得到一些格式错误的 json。

geocoded_waypoints是一个数组,但routes也是,这意味着你最终会得到一个看起来像这样的字符串:

[
{ "geocoder_status" : "OK" ... }
{ "geocoder_status" : "OK" ... }
], "routes": [
{ "bounds": { ... } ... }
]

, "routes": [将无法解析。

更新

经过评论中的一些讨论,我想我已经结束了我能够提供的帮助。我不熟悉 C# 或您正在使用的特定 JSON 解析库。

但是,我可以提供一些想法作为起点。

从谷歌调用返回的JSON具有特定的结构。我怀疑您将不得不创建与此结构匹配的新模型类。例如,顶级对象将具有三个字段,在 Java 中可能如下所示:

public class ApiResponse {
private List<Waypoint> geocoded_waypoints;
private List<Route> routes;
private String status;
}

然后你必须实现WaypointRoute,再次匹配谷歌响应的结构:

public class Waypoint {
private String geocoder_status;
private String place_id;
private List<String> types;
}
public class Route {
private Bounds bounds;
private String copyrights;
private List<Leg> legs;
private Polyline overview_polyline;
private String summary;
private List<String> warnings;
private List<String> waypoint_order;
}

等等。一旦你有一个类来表示顶级响应以及该响应中的所有各种子对象,你可能就可以更改以下代码:

List<Model.Localizacao> lstLoc = new List<Model.Localizacao>();
var json = await client.GetStringAsync("https://maps.googleapis.com/maps/api/directions/json?origin=" + locUser.latitude + "," + locUser.longitude + "&destination="+ locLoja.latitude+","+locLoja.longitude+"&key=" + GOOGLEMAPSKEY);
json = json.Substring(json.IndexOf('['));
json = json.Substring(0, json.LastIndexOf(']') + 1);
lstLoc = JsonConvert.DeserializeObject<List<Model.Localizacao>>(json);
return lstLoc;

对此:

var json = await client.GetStringAsync("https://maps.googleapis.com/maps/api/directions/json?origin=" + locUser.latitude + "," + locUser.longitude + "&destination="+ locLoja.latitude+","+locLoja.longitude+"&key=" + GOOGLEMAPSKEY);
return JsonConvert.DeserializeObject<ApiResponse>(json);

最新更新