2017-06-11 7 views
3

Why you should use F#」のチャンネル9のビデオを見ていて、データをWikipediaから簡単に取り出せるようになったことに感心しました。彼が入力した通り例えば、彼はデータを見つけるの当て推量を取った最後の行にインテリセンスを持っていた、博士は誰の異なる外観を記載されている次のコード...F#JsonProviderのURLからJSONを読み込むには

[<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 

を示しました。

最近Google Maps APIからデータを取得する必要がありました。たとえば、以下のURLは、英国の郵便番号SW1A 1AA(場合バッキンガム宮殿いずれかが興味を持っている!)のためのデータを引き出し...データだけでJSONであることを考えると

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

、私はそれが平等であるべきと思いましたF#を使用して情報を引き出すのは簡単です。しかし、私は緯度と経度を取得しようとして立ち往生した。

私は、次の...

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

で始まった...しかし、その後データを抽出しようとして捕まってしまいました。 jsonには、1つのエントリを持つ配列が含まれています。それには、ノードが含まれています。このノードには、2つの値を保持するノードlocationが含まれています。擬似コードでは、このようなことを期待していたでしょう...

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

...しかし、これはうまくいきませんでした。私はGetSample()を使わずに試しましたが、それ以上は得られませんでした。インテリセンスは私にJsonとまったくマッチしないようなものを見せてくれました... enter image description here

私はどこに間違っているのかアドバイスできますか?データを見つけるにはどうすればいいですか?さらにポイントとして、私はIntellisenseにどのように手伝ってもらうのですか?私はC#でこれを行うことができましたが、動的オブジェクトを使用する必要があったため、Intellisenseには届かなかったので、非常にヒットアンドミスでした。そのビデオで見たものに基づいて、ここでIntellisenseを入手したいと考えていました。

答えて

3

JSON応答には、2つのトップレベルオブジェクト、resultsおよびstatusが含まれています。

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

経度緯度とは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 
+0

感謝をそのために、私はその地位もトップレベルにあったとは思わなかった! 'let(lat、lng)= ???'のように、行全体を2回呼び出す以外に、緯度と経度の両方を得るためのきれいな方法がありますか? –

+2

あなたはヘルパー関数 'let ll2tp(ll:GoogleData.Northeast)=(ll.Lat、ll.Lng)'を定義し、let(lat、lng)= honley.Results。[0] .Geometry.Location |> ll2tp' – DaveShaw

+0

ありがとうございます。私が実際にそうすることで多くを得るかどうかはわかりませんが、知る価値があります。助けてくれてありがとう。 –

関連する問題