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

时间:2015-10-10 16:39:10

标签: f# f#-3.0 f#-data

这是我关于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”看到了可访问性

enter image description here

那么,问题:如何使用JsonExtensions?

1 个答案:

答案 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中的所有内容。