2015-10-10 12 views
5

Kullanılması Bu SO benim ilk soru ... yani) F # Veri: JSON Ayrıştırıcı. JsonExtensions

Genellikle tüm soru) = beni, onları bir sürü inanmak ( chat rooms yılında techout) = kesinlikle karar vermeyin.

Son zamanlarda, RosettaCode hakkında konuşuyoruz. Ve bazı görev kodlarını tamamlayabileceğimi merak ettim F #

Bunlardan biri JSON.

Olası çözümlerden biri "F # Data: JSON Parser" kullanımıdır. Bu yüzden benim sorum bununla bağlantılı.

Bu kod

iyi çalışıyor:

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) 

Baskı:

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

Ama

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

iyi görünmüyor.

This Ben JsonExtensions hakkında

okumak ama

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

kullandığımda derleme hatası alıyorsunuz:

  • alan, yapıcı ya da "AsInteger"

  • tanımlı değil
  • Alan, yapıcı veya "AsString" n Nasıl JsonExtensions kullanmak: ot şey, soru "açık FSharp.Data.JsonExtensions"

    enter image description here

    Yani aracılığıyla erişilebilirlik bakın yani, Garip

tanımlanmış?

cevap

3

Bunu en az bir örnek kullanarak çoğaltmaya çalıştım ancak hatayı alamıyorum - aşağıdaki en az örneği deneyebilir misiniz?

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

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

I (editör kısıtlamasıdır) a?ID. üzerine otomatik olarak doldurulmasını elde yoktur, ama iyi derler. Eğer JsonValue dönmüyor ? operatörün başka uygulanmasını ithal ederim başka open deklarasyon olsaydı bu çalışmıyor olabileceğini düşünüyorum neden

tek sebebi.

JsonValue API'si, yalnızca tür sağlayıcısını kullanmak kadar iyi değildir - bu nedenle, muhtemelen bunun yerine tip sağlayıcıya gideceğim (düşük düzey API, her şeyde yineleme yapmanız gerekiyorsa iyi olur) Ardışık JSON).

+0

Evet, aynı hatalar aynı –

+0

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

+0

Bu çok kafa karıştırıcı. F # + VS hangi sürümünü kullanıyorsunuz? –