我正在" 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完全不匹配的东西......
任何人都可以告诉我哪里出错了?我如何找到数据?更重要的是,我如何让Intellisense帮助我?我设法在C#中做到这一点,但由于我不得不使用动态对象,所以它非常突然,所以没有得到Intellisense。根据我在视频中看到的内容,我希望能够在这里获得Intellisense。
答案 0 :(得分:3)
JSON响应包含2个顶级对象results
和status
。
{
"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