F#JSON Typeprovider在丢失数据时崩溃

jto*_*ain 2 f# f#-data

如何处理JSON文件中的缺失数据?使用数据列表,您只需使用地图功能即可.但是对象怎么样呢

说我有样本数据:

{
    "Person":{
    "FirstName":"John",
    "LastName":"Doe",
    "Age": 42,
    "Address": {
        "Street": "SomeStreet",
        "City" : "Some City"
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

我的实际数据如下:

{
    "Person":{
    "FirstName":"John",
    "Age": 42
    }
} 
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何使地址可选:

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

let address = personData.Person.Addres // gives an exception
Run Code Online (Sandbox Code Playgroud)

同时尝试将其转换为可选的失败,请让p = personData.Person.Address |> Option.ofObj

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

我无法想象我应该用一些丢失的数据更改每个文件的代码.

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

Cha*_*ert 5

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

open FSharp.Data

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

let personData = personJson.Load("Data/personData.json")
Run Code Online (Sandbox Code Playgroud)

内容personsSample.json可能看起来像这样,包括你的原始json和没有地址的json的变体:

[
    {
        "Person":{
            "FirstName":"John",
            "LastName":"Doe",
            "Age": 42,
            "Address": {
                "Street": "SomeStreet",
                "City" : "Some City"
                }
        }
    }, 
    {
        "Person":{
            "FirstName":"John",
            "LastName":"Doe",
            "Age": 42
        }
    } 
]
Run Code Online (Sandbox Code Playgroud)

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