如何使用F#JsonProvider

时间:2017-06-11 14:37:37

标签: json f# type-providers

我正在" Why you should use F#"观看第9频道的视频。并且对从维基百科中提取数据的难易程度印象深刻。例如,他展示了以下代码,列出了Dr. Who ......的不同外观。

[<Literal>]
let url = @"https://en.wikipedia.org/wiki/Doctor_Who"
type DoctorWhoData = HtmlProvider<url>

let data = DoctorWhoData.GetSample()
let app = data.Tables.``Changes of appearance``.Rows

在他输入的时候,他在最后一行上有了Intellisense,这让猜测工作无需查找数据。

我最近要求从Google Maps API中提取一些数据。例如,以下URL提取英国邮政编码SW1A 1AA(白金汉宫的数据,如果有兴趣的话!)......

http://maps.google.com/maps/api/geocode/json?address=sw1a+1aa+uk

鉴于数据只是Json,我认为使用F#从信息中提取信息应该同样容易。但是,我试图获得经度和经度。

我从以下开始......

type GoogleData = JsonProvider<"http://maps.google.com/maps/api/geocode/json?address=sw1a+1aa+uk">

...但后来试图提取数据而陷入困境。 json包含一个带有一个条目的数组。它包含一个geometry节点,其中包含一个包含两个值的location节点。在伪代码中,我本来希望做这样的事情......

let lat = GoogleData.GetSample().[0].geometry.location.lat

......然而,这并没有奏效。我试过没有GetSample(),但没有进一步。 Intellisense向我展示了似乎与Json完全不匹配的东西...... enter image description here

任何人都可以告诉我哪里出错了?我如何找到数据?更重要的是,我如何让Intellisense帮助我?我设法在C#中做到这一点,但由于我不得不使用动态对象,所以它非常突然,所以没有得到Intellisense。根据我在视频中看到的内容,我希望能够在这里获得Intellisense。

1 个答案:

答案 0 :(得分:3)

JSON响应包含2个顶级对象resultsstatus

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "SW1A 1AA",
               "short_name" : "SW1A 1AA",
               "types" : [ "postal_code" ]
    //snip
    ],
    "status" : "OK"
}

lat和long位于results之下,因此您需要从.GetSample()

开始关注
let lat = GoogleData.GetSample().Results.[0].Geometry.Location.Lat

要使用样本数据以外的数据,请使用Load函数:

let honley = GoogleData.Load "http://maps.google.com/maps/api/geocode/json?address=honley+uk"
let honley_latlong = honley.Results.[0].Geometry.Location

//{
//  "lat": 53.602267,
//  "lng": -1.794173
//}
printfn "%A" honley_latlong