【问题标题】:F# JSON Typeprovider crashes on missing dataF# JSON Typeprovider 在丢失数据时崩溃
【发布时间】:2017-03-16 00:42:08
【问题描述】:

如何处理 JSON 文件中的缺失数据?使用数据列表,您可以简单地使用地图功能。但是对象呢

假设我有样本数据:

{
    "Person":{
    "FirstName":"John",
    "LastName":"Doe",
    "Age": 42,
    "Address": {
        "Street": "SomeStreet",
        "City" : "Some City"
        }
    }
} 

我的实际数据如下:

{
    "Person":{
    "FirstName":"John",
    "Age": 42
    }
} 

我不知道如何将地址设为可选:

type personJson = JsonProvider<"Data/personSample.json">
let personData = testJson.Load("Data/personData.json")

let address = personData.Person.Addres // gives an exception

也尝试将其转换为可选项失败 让 p = personData.Person.Address |> Option.ofObj

System.Exception:由于先前的错误,操作无法完成 'JsonProvider<...>.Address' 类型在 2,35 处没有 'null' 作为正确值

我无法想象我应该为每个缺少数据的文件更改代码。

那么我该怎么做才能解决这个问题呢?

【问题讨论】:

  • 简短的回答是您将SampleIsList 设置为true 并给出所有可能形状的json 对象列表。
  • 我的印象是 SampleIsList 在我的情况下不起作用。正如我的问题中提到的,我不使用列表,而只使用 1 个对象。添加 SampleIsList 后,请求 Address 对象仍然会导致异常: System.Exception: Property 'Address' not found at '/Person': {"FirstName":"John","Age":42,"Address":空}

标签: f# f#-data


【解决方案1】:

您可以在设置类型提供程序时使用SampleIsList = true,以提供对象形状的多种变化。

open FSharp.Data

type personJson = JsonProvider<"Data/personsSample.json", SampleIsList = true>

let personData = personJson.Load("Data/personData.json")

personsSample.json 的内容可能如下所示,其中包括您的原始 json 和该 json 的变体,但没有地址:

[
    {
        "Person":{
            "FirstName":"John",
            "LastName":"Doe",
            "Age": 42,
            "Address": {
                "Street": "SomeStreet",
                "City" : "Some City"
                }
        }
    }, 
    {
        "Person":{
            "FirstName":"John",
            "LastName":"Doe",
            "Age": 42
        }
    } 
]

现在,当您加载单个 personData 示例时,引用地址字段将正确处理空值而不是崩溃。

【讨论】:

  • 我不知道我可以在我的测试集中添加多个对象(一个有地址,一个没有)。现在我得到一个 val 它: Option.Address> = None -> 所以我可以毫无例外地检查我的数据。非常感谢乍得吉尔伯特!
猜你喜欢
  • 2021-01-13
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2018-11-04
  • 2017-01-26
相关资源
最近更新 更多