我正在学习类型提供程序,它看起来像是一个突破性的功能。但是,我无法设法使用 JsonProvider 反序列化 json,以便目标类型具有 Generic.Dictionary 属性。可以使用 Json.NET 来完成。这是代码:
type ByProv = JsonProvider<"""{"dict":{"A":1,"B":2}}""">
type ByHand(d:Dictionary<string,int>) =
member val dict = d with get,set
let text = """{"dict":{"C":3,"D":4}}"""
let newt = JsonConvert.DeserializeObject<ByHand> text
let prov = ByProv.Parse text
printfn "%A" newt.dict.["C"]
//Can only call statically inferred A or B (and it will throw at run-time)
printfn "%A" prov.Dict.A
显然,dict
被推断为记录类型而不是Dictionary
默认情况下。这可以被覆盖吗?
JSON 类型提供程序假定 JSON 记录用于存储记录(具有固定字段名称),并且 JSON 数组用于存储集合。您的示例是这种方法效果不佳的情况之一。
当您需要访问具有动态命名字段的 JSON 记录时,您可以使用底层JsonValue
由提供的类型公开:
type ByProv = JsonProvider<"""{"dict":{"A":1,"B":2}}""">
let text = """{"dict":{"C":3,"D":4}}"""
let prov = ByProv.Parse text
prov.Dict.JsonValue.["C"].AsInteger()
这不太好,我想 JSON 类型提供程序可以扩展以更好地处理这个问题(并将记录更像数组)。请随意提交问题以供讨论,或者提交拉取请求至GitHub 上的 F# 数据 https://github.com/fsharp/FSharp.Data!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)