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

F# Data: JSON Parser. Using JsonExtensions

这是我关于SO的第一个问题...所以不要严格判断=)

通常我所有的问题都在 chat rooms 中解决(相信我,其中很多 =))。

最近,我们在谈论RosettaCode。我想补充一些任务代码到 F#

其中之一是JSON

一种可能的解决方案是使用“F# 数据: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)}

看起来不太好。

This 我读到了 JsonExtensions,

但是当我使用

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

我遇到编译错误:

奇怪的是,我通过“打开 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 中的所有内容,24=] 是很好的选择。