2015-10-10 4 views
5

Es ist meine erste Frage auf SO ... so urteilen nicht streng =)F # Daten: JSON-Parser. Mit JsonExtensions

Normalerweise werden alle meine Fragen techout in chat rooms (glauben Sie mir, viele von ihnen =)).

Kürzlich sprechen wir über die RosettaCode. Und ich wunderte mich, einige der Aufgaben Code zu ergänzen F #

Einer von ihnen ist JSON.

Eine der möglichen Lösungen ist die Verwendung von "F # Data: JSON Parser". Also meine Frage ist damit verbunden.

Dieser Code funktioniert gut:

open FSharp.Data 
open FSharp.Data.JsonExtensions 

type Person = {ID: int; Name:string} 

let json = """[ { "ID": 1, "Name": "First" }, { "ID": 2, "Name": "Second" }]""" 
json |> printfn "%s" 

match JsonValue.Parse(json) with 
| JsonValue.Array(x) -> 
    x |> Array.map(fun x -> {ID = System.Int32.Parse((x?ID).ToString()); Name = (string x?Name)}) 
| _ -> failwith "fail json" 
|> Array.iter(fun x -> printfn "%i %s" x.ID x.Name) 

Druck:

[ { "ID": 1, "Name": "First" }, { "ID": 2, "Name": "Second" }] 
1 "First" 
2 "Second" 

Aber es

{ID = System.Int32.Parse((x?ID).ToString()); Name = (string x?Name)} 

sieht nicht gut aus.

This Ich las über JsonExtensions,

aber wenn ich

verwenden
{ID = (x?ID.AsInteger()) ; Name = (x?Name.AsString()) } 

ich Fehler kompilieren erhalten:

  • Das Feld, Konstruktor oder "AsInteger" ist nicht definiert

  • Das Feld, Konstruktor oder "AsString" ist n ot definiert

Merkwürdig ist, dass ich Zugänglichkeit durch "offene FSharp.Data.JsonExtensions" sehen

enter image description here

So Frage: Wie JsonExtensions benutzen?

Antwort

3

Ich habe versucht, dies mit einem minimalen Beispiel zu reproduzieren, aber ich bekomme den Fehler nicht - können Sie das folgende minimale Beispiel versuchen?

#r "...../FSharp.Data.dll" 
open FSharp.Data.JsonExtensions 
open FSharp.Data 

JsonValue.Parse("A").AsArray() 
|> Array.map (fun a -> a?ID.AsInteger()) 

ich Auto-Vervollständigung auf a?ID. nicht (das ist eine Einschränkung des Editors ist), aber es kompiliert in Ordnung.

Der einzige Grund, warum ich denke, dass das nicht sein könnte arbeiten, wenn Sie eine andere open Erklärung haben, die weitere Implementierung des ? Betreibers importieren würde, die nicht JsonValue zurückkehren wird. Die JsonValue API ist sicherlich nicht so schön, wie nur den Typ Provider zu verwenden - also wenn Sie können, würde ich wahrscheinlich für den Typ Anbieter stattdessen gehen (die Low-Level-API ist gut, wenn Sie über alles in iterieren müssen JSON rekursiv).

+0

Ja, Fehler sind die gleichen –

+0

http://i.stack.imgur.com/l9Rz5.png –

+0

Das ist sehr verwirrend. Welche Version von F # + VS verwendest du? –