2011-12-07 6 views
1

私はJsonのファイルを発見しています。次のJsonファイル(Facebook接続から抽出したもの)を読み込み、この場合のようにF#リストにデータを入れるF#コードを作成したいと思います。["id";"Name";"first_name";"last_name";"link";"username";"birthday";"gender"] 。あなたはなにか考えはありますか ?私は、これでは専門家ではないですし、あなたがこのJsonの情報をF#のリストに変換する

JSONファイルについての考えがあれば、それは私にとって非常に参考になる:

{ 
    "id": "6234306", 
    "name": "Katter Maxime", 
    "first_name": "Katter", 
    "last_name": "Maxime", 
    "link": "http://www.facebook.com/katter.maxime", 
    "username": "katter.maxime", 
    "birthday": "11/10/1982", 
    "work": [ 
    { 
     "employer": { 
     "id": "10164958321", 
     "name": "Bedur" 
     }, 
     "position": { 
     "id": "14014810602", 
     "name": "student" 
     }, 
     "start_date": "0000-00", 
     "end_date": "0000-00" 
    } 
    ], 
    "education": [ 
    { 
     "school": { 
     "id": "107990348", 
     "name": "AAAAAAAA" 
     }, 
     "year": { 
     "id": "1406175699", 
     "name": "2007" 
     }, 
     "type": "Graduate School" 
    } 
    ], 
    "gender": "male", 
    "locale": "en_US", 
    "updated_time": "2011-11-03T17:31:04+0000", 
    "type": "user" 
} 

答えて

3

jsonKeys.fsx :

#r "System.Web.Extensions.dll" 

open System 
open System.IO 
open System.Collections.Generic 
open System.Web.Script.Serialization 

let _ = 
    let jsonStr = File.ReadAllText "json.txt" 
    let jss = new JavaScriptSerializer(); 
    let dic = jss.DeserializeObject(jsonStr) :?> Dictionary<string, obj> 
    let keyList = dic.Keys |> Seq.toList 
    printfn "%A" keyList 

入力DEMO

>fsi jsonKeys.fsx 
["id"; "name"; "first_name"; "last_name"; "link"; "username"; "birthday"; "work"; 
"education"; "gender"; "locale"; "updated_time"; "type"] 

ADDの場合と同様に

{"data":[{"id":"902395","name":"Thomas Girba"},{"id":"194589","name":"Durand Gure"},..]} 


let listToTuple [x;y] = (string x, string y) 
let _ = 
    let jsonStr = File.ReadAllText "json2.txt" 
    let jss = new JavaScriptSerializer(); 
    let dic = jss.DeserializeObject(jsonStr) :?> Dictionary<string, obj> 
    let data = dic.["data"] :?> obj [] 
(* 
    let result = 
    data 
    |> Array.map (fun x -> (x :?> Dictionary<string,obj>).Keys |> Seq.toList |> listToTuple) 
    printfn "%A" result //[|("id", "name"); ("id", "name")|] 
*) 
    let result = 
    data 
    |> Array.map (fun x -> 
     let d = x :?> Dictionary<string,obj> 
     string d.["id"], string d.["name"] //value 
     ) 
    printfn "%A" result //[|("902395", "Thomas Girba"); ("194589", "Durand Gure")|] 

open Microsoft.FSharp.Reflection 
let arrayToTuple (ar: 'a array) = 
    let len = Array.length ar 
    let ty = FSharpType.MakeTupleType(Array.create len typeof<'a>) 
    FSharpValue.MakeTuple(ar, ty) 
+0

ありがとうございますが、どのように答えをお願いしますか? ( "id"; "6234306");( "名前"; "Katter Maxime") – katter75

+0

PS:どういう意味で「答えを得ているのですか」というのは、結果が "id" "しかし、人のID、ここでは" 6234306 ")。私が前に尋ねたように、最高のものはタプルですが、それは可能だと思いますか? – katter75

+1

@ katter74、KeyValuePairが必要な場合は、 "dic |> Seq.toList"をリストします。あなたがタプルを望むなら、 "dic |> Seq.map(fun x - > x.Key、x.Value)|> Seq.toList"をリストします。 – BLUEPIXY

4

使用をJson.NET

[ for KeyValue(key, _) in (JObject.Parse(json) :> IDictionary<_,_>) -> key ] 
+0

私は、次のようなエラーがあります。エラーFS0001:互換性のないタイプ。待っている JToken - >「 が、取得 KeyValuePair <'b,'c> - >」JTokenがKeyValuePair <'a,'b> 『 – katter75

+0

つ以上のコメント『タイプに対応していない』「 タイプC』のb *:あなたはどのように任意のアイデアを持っています結果としてタプルがありますか? ( "id"; "6234306");( "名前"; "Katter Maxime")... – katter75

+0

「IDictionary <_,_>」へのキャストを忘れました。修正されました。再帰を使ってキーと値のペアを正しく出力する必要がありますが、できることはトップレベルの子を得るためです: 'JObject.Parse(json).Children ()|> Seq.map(fun p - > p。名前、p.Value.ToString()) '。 – Daniel

関連する問題