4

我想用谷歌地图距离矩阵 API 计算 C# 中点之间的距离。

我使用以下代码发出请求:

private void MapsAPICall()
    {
        //Pass request to google api with orgin and destination details
        HttpWebRequest request =
            (HttpWebRequest)WebRequest.Create("http://maps.googleapis.com/maps/api/distancematrix/json?origins="
            + "51.123959,3.326682" + "&destinations=" + "51.158089,4.145267" 
            + "&mode=Car&language=us-en&sensor=false");

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        using (var streamReader = new StreamReader(response.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();

            if (!string.IsNullOrEmpty(result))
            {
                Distance t = JsonConvert.DeserializeObject<Distance>(result);
            }
        }
    }

然后我想将 json 答案解析为 Distance 类:

public struct Distance
{
   // Here I want to parse the distance and duration
}

这是我收到的 json 响应示例: http ://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC&destinations=San+Francisco&mode=bicycling&language=fr-FR&sensor=false

如何将距离和持续时间解析为距离类?
这是我第一次使用 Json,所以我没有经验。

Ps:我已经安装了 json.net 库。

4

4 回答 4

5

Web Essentials有一个“将 JSON 粘贴为类”的选项。这将生成反序列化 JSON 所需的类。

使用此选项将为您生成以下内容:

public class Distance
{
    public string text { get; set; }
    public int value { get; set; }
}

public class Duration
{
    public string text { get; set; }
    public int value { get; set; }
}

public class Element
{
    public Distance distance { get; set; }
    public Duration duration { get; set; }
    public string status { get; set; }
}

public class Row
{
    public Element[] elements { get; set; }
}

public class Parent
{
    public string[] destination_addresses { get; set; }
    public string[] origin_addresses { get; set; }
    public Row[] rows { get; set; }
    public string status { get; set; }
}

(如果需要,您可以重构生成的代码以使其更具可读性。您需要添加 Json.NET 属性以确保序列化仍然有效)

然后在您的代码中,您可以使用以下行来反序列化您的代码:

Parent result = JsonConvert.DeserializeObject<Parent>(json);
于 2012-12-04T13:10:08.853 回答
2

Visual Studio 2015+ 更新

作为对 Wouter de Kort 的有用答案的补充,这里是 Visual Studio 2015+ 的更新。

Visual Studio 2015+ 具有 Wouter 描述的方便的“将JSON 粘贴为类”。

要自己生成 GoogleMaps API JSON 反序列化所需的类:

  1. 在 Web 浏览器或 REST 客户端中,导航到填充了一些测试参数的 GoogleMaps API URL。例如:https://maps.googleapis.com/maps/api/distancematrix/json?origins=30.3449153,-81.860543&destinations=33.7676932,-84.4906437&language=en-US&units=imperial&key=<API_KEY>
  2. Ctrl+C将生成的原始 JSON 响应从浏览器/客户端复制 ( ) 到剪贴板。
  3. 在 Visual Studio 2015+ 中,打开要.cs在其中创建类的文件。
  4. 将光标放在.cs您希望生成类的文件中。
  5. 从 Visual Studio 的菜单中选择Edit > Paste Special > Paste JSON as Classes

结果类的示例

public class Rootobject
{
    public string[] destination_addresses { get; set; }
    public string[] origin_addresses { get; set; }
    public Row[] rows { get; set; }
    public string status { get; set; }
}

public class Row
{
    public Element[] elements { get; set; }
}

public class Element
{
    public Distance distance { get; set; }
    public Duration duration { get; set; }
    public string status { get; set; }
}

public class Distance
{
    public string text { get; set; }
    public int value { get; set; }
}

public class Duration
{
    public string text { get; set; }
    public int value { get; set; }
}

从那时起,您可以遵循 Wouter 的其他建议。

Rootobject result = JsonConvert.DeserializeObject<Rootobject>(json);
于 2017-01-27T14:02:51.373 回答
0

已经晚了,但可能对某人有用。在这种情况下,我们有一个 JSON 字符串并希望有一个适当的类结构来正确反序列化它,您可以使用在线工具http://json2csharp.com/

只需粘贴您的 JSON 字符串并单击“生成”按钮。它将为您提供所需的类结构。就是这么简单。当您想避免安装外部工具时,这种方法很有用。

于 2017-06-22T12:39:32.433 回答
-1

“距离”类型需要正确建模 JSON 模式,例如:

public string[] destination_addresses { get; set; }
public string[] origin_addresses { get; set; }
public Row[] rows { get; set; }
public string status { get; set; }

(当然,像这样的子类型Row也需要建模)

除此之外,您对 Json.Net 的使用:

Distance t = JsonConvert.DeserializeObject<Distance>(result);

应该可以

于 2012-12-04T13:09:55.450 回答