F# 数据:JSON解析器。使用JsonExtensions
这是我的第一个问题,所以…不要严格地评判=) 通常我所有的问题都是以科技形式提出的(相信我,很多问题都是) 最近,我们正在谈论这个问题。我想补充F的一些任务代码# 其中之一是 可能的解决方案之一是使用“F#Data:JSON解析器”。因此,我的问题与此相关 此代码运行良好:F# 数据:JSON解析器。使用JsonExtensions,f#,f#-3.0,f#-data,F#,F# 3.0,F# Data,这是我的第一个问题,所以…不要严格地评判=) 通常我所有的问题都是以科技形式提出的(相信我,很多问题都是) 最近,我们正在谈论这个问题。我想补充F的一些任务代码# 其中之一是 可能的解决方案之一是使用“F#Data:JSON解析器”。因此,我的问题与此相关 此代码运行良好: open FSharp.Data open FSharp.Data.JsonExtensions type Person = {ID: int; Name:string} let json = ""&
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)}
看起来不太好
我读过关于JsonExtensions的书
但是当我使用
{ID = (x?ID.AsInteger()) ; Name = (x?Name.AsString()) }
我发现编译错误:
- 未定义字段、构造函数或“AsInteger”
- 未定义字段、构造函数或“AsString”
所以,问题是:如何使用JsonExtensions?我试图用一个最小的示例来重现这一点,但我没有得到错误-您可以尝试以下最小的示例吗
#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肯定不如只使用类型提供程序好——因此如果可以的话,我可能会选择类型提供程序(如果需要递归地迭代JSON中的所有内容,那么低级API是很好的)。这非常令人困惑。你使用的是什么版本的F#+VS?(它们是C风格的扩展方法,所以我认为这在VS2012中不起作用)是的,我有VS12。你能解释一下为什么这个版本不行吗?啊,这就解释了。所有这些都是使用扩展名
属性编写的。仅VS 2013附带的F#支持使用这些功能-早期版本的F#不支持C#风格的扩展方法。感谢您的回复。