F# - JSON类型提供程序 - 文字字符串

时间:2017-11-14 01:59:39

标签: f# type-providers

我使用F#Type提供程序时遇到了一个有趣的问题。使用以下示例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字段!

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你必须使用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.   其他“,”IdDatetime“:”2017-11-11T13:10:00 + 00:00“};       {“Id”:“005”,“姓名”:“D。其他”,“IdDatetime”:“2017-11-11T13:10:00 + 00:00”} |]