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()) }
我遇到编译错误:
未定义字段、构造函数或“AsInteger”
未定义字段、构造函数或“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=] 是很好的选择。
这是我关于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()) }
我遇到编译错误:
未定义字段、构造函数或“AsInteger”
未定义字段、构造函数或“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=] 是很好的选择。