F# - JSON 类型提供程序 - 文字字符串
F# - JSON Type Provider - Literal String
我在使用 F# 类型提供程序时遇到一个有趣的问题。使用以下示例 json 生成所需的类型效果很好,但有一个明显的问题 - 其中一个值是文字字符串(“235”),但该字符串不会出现在实际数据中 - 每条新记录都有一个不同的三位数:
{
"record": {
"235": {
"Id": "001",
"Name": "A. N. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
...
}
"255": {
"Id": "005",
"Name": "D. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
...
}
}
所以,不幸的是,我无法在事先不知道三位数代码的情况下访问 Id、Name 和 IdDateTime 字段!
有什么建议吗?
一定要用JsonProvider吗? FSharp.Data 中有一个更简单的 JsonParser,可以更轻松地访问更多动态数据。之后,它只是一个简单的练习来解构它以到达内部。
#r @"../packages/FSharp.Data/lib/net40/FSharp.Data.dll"
open FSharp.Data
open FSharp.Data.JsonExtensions
[<Literal>]
let jsonText = """
{
"record": {
"235": {
"Id": "001",
"Name": "A. N. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
}
}
}
"""
let json1 = JsonValue.Parse(jsonText)
let json2 = json1?record
let json3 =
match json2 with
| JsonValue.Record x -> x
let json4 =
match json3 with
[|(_,x)|] -> x
val json4 : JsonValue = { "Id": "001", "Name": "A. N. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00" }
编辑
对于 jsonvalues 数组,这同样有效,除了你必须映射匹配函数。例如:
let jsonText2 = """
{
"record": {
"235": {
"Id": "001",
"Name": "A. N. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
},
"255": {
"Id": "005",
"Name": "D. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
}
}
}
"""
let json1 = JsonValue.Parse(jsonText2)
let json2 = json1?record
let json3 =
match json2 with
| JsonValue.Record x -> x
let json4 =
json3
|> Array.map (function _,x -> x)
val json4 : JsonValue [] = [|{ "Id": "001", "Name": "A. N.
Other", "IdDatetime": "2017-11-11T13:10:00+00:00" };
{ "Id": "005", "Name": "D. Other", "IdDatetime": "2017-11-11T13:10:00+00:00" }|]
我在使用 F# 类型提供程序时遇到一个有趣的问题。使用以下示例 json 生成所需的类型效果很好,但有一个明显的问题 - 其中一个值是文字字符串(“235”),但该字符串不会出现在实际数据中 - 每条新记录都有一个不同的三位数:
{
"record": {
"235": {
"Id": "001",
"Name": "A. N. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
...
}
"255": {
"Id": "005",
"Name": "D. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
...
}
}
所以,不幸的是,我无法在事先不知道三位数代码的情况下访问 Id、Name 和 IdDateTime 字段!
有什么建议吗?
一定要用JsonProvider吗? FSharp.Data 中有一个更简单的 JsonParser,可以更轻松地访问更多动态数据。之后,它只是一个简单的练习来解构它以到达内部。
#r @"../packages/FSharp.Data/lib/net40/FSharp.Data.dll"
open FSharp.Data
open FSharp.Data.JsonExtensions
[<Literal>]
let jsonText = """
{
"record": {
"235": {
"Id": "001",
"Name": "A. N. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
}
}
}
"""
let json1 = JsonValue.Parse(jsonText)
let json2 = json1?record
let json3 =
match json2 with
| JsonValue.Record x -> x
let json4 =
match json3 with
[|(_,x)|] -> x
val json4 : JsonValue = { "Id": "001", "Name": "A. N. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00" }
编辑
对于 jsonvalues 数组,这同样有效,除了你必须映射匹配函数。例如:
let jsonText2 = """
{
"record": {
"235": {
"Id": "001",
"Name": "A. N. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
},
"255": {
"Id": "005",
"Name": "D. Other",
"IdDatetime": "2017-11-11T13:10:00+00:00"
}
}
}
"""
let json1 = JsonValue.Parse(jsonText2)
let json2 = json1?record
let json3 =
match json2 with
| JsonValue.Record x -> x
let json4 =
json3
|> Array.map (function _,x -> x)
val json4 : JsonValue [] = [|{ "Id": "001", "Name": "A. N. Other", "IdDatetime": "2017-11-11T13:10:00+00:00" }; { "Id": "005", "Name": "D. Other", "IdDatetime": "2017-11-11T13:10:00+00:00" }|]