【问题标题】:F# - JSON Type Provider - Literal StringF# - JSON 类型提供程序 - 文字字符串
【发布时间】:2017-11-14 17:32:34
【问题描述】:

我在使用 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 字段!

有什么建议吗?

【问题讨论】:

    标签: f# type-providers


    【解决方案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", "Name": "D. Other", "IdDatetime": "2017-11-11T13:10:00+00:00" }|]

    【讨论】:

    • match json4 在有多个 JsonValue(例如“235”和“255”)时会失败?
    • 这只是一个示例。您可以使用它来遍历结构。但让我稍后调整答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多