Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 数据:JSON解析器。使用JsonExtensions_F#_F# 3.0_F# Data - Fatal编程技术网

F# 数据:JSON解析器。使用JsonExtensions

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 = ""&

这是我的第一个问题,所以…不要严格地评判=)

通常我所有的问题都是以科技形式提出的(相信我,很多问题都是)

最近,我们正在谈论这个问题。我想补充F的一些任务代码#

其中之一是

可能的解决方案之一是使用“F#Data: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”

奇怪的是,我通过“open FSharp.Data.JsonExtensions”看到了可访问性


所以,问题是:如何使用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#风格的扩展方法。感谢您的回复。