这是我关于SO的第一个问题......所以不要严格判断=)
通常我所有的问题都在chat rooms中的问题(相信我,很多人=)。
最近,我们谈论的是RosettaCode。我想知道将一些任务代码补充到F#
其中一个是JSON。
其中一个可能的解决方案是使用“F#Data:JSON Parser”。所以我的问题与它有关。
此代码效果很好:
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)
打印:
[ { "ID": 1, "Name": "First" }, { "ID": 2, "Name": "Second" }]
1 "First"
2 "Second"
但是
{ID = System.Int32.Parse((x?ID).ToString()); Name = (string x?Name)}
看起来不太好。
This我读到了JsonExtensions,
但是当我使用
时{ID = (x?ID.AsInteger()) ; Name = (x?Name.AsString()) }
我收到编译错误:
未定义字段,构造函数或“AsInteger”
未定义字段,构造函数或“AsString”
奇怪的是,我通过“open FSharp.Data.JsonExtensions”看到了可访问性
那么,问题:如何使用JsonExtensions?
答案 0 :(得分:3)
我尝试使用最小的示例重现这一点,但我没有收到错误 - 您可以尝试以下最小样本吗?
#r "...../FSharp.Data.dll"
open FSharp.Data.JsonExtensions
open FSharp.Data
JsonValue.Parse("A").AsArray()
|> Array.map (fun a -> a?ID.AsInteger())
我没有在a?ID.
上获得自动完成(这是编辑器的限制),但编译得很好。
我认为这可能不起作用的唯一原因是,如果您有另一个open
声明将导入另一个未返回?
JsonValue
运算符的实现。
JsonValue
API肯定不如使用类型提供程序那么好 - 所以如果可以的话,我可能会选择类型提供程序(如果需要迭代,则低级API很好)以递归的方式处理JSON中的所有内容。