F# JSON Typeprovider 因丢失数据而崩溃

sharpest 阅读:49 2025-02-15 21:57:57 评论:0

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

假设我有样本数据:

{ 
    "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 来提供有关对象形状的多种变体。

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 示例时,引用地址字段将正确处理空值而不是崩溃。


标签:json
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号