gpt4 book ai didi

json - 如何将 JSON 反序列化为 F# 中记录的映射/字典?

转载 作者:行者123 更新时间:2023-12-02 14:50:56 25 4
gpt4 key购买 nike

这是 JSON 的形状:

{
"Alice": {
"Age": 30,
"Address": {
"City": "New York",
"State": "NY"
}
},
"Bob": {
"Age": 6,
"Address": {
"City": "Chicago",
"State": "IL"
}
}
}

我想将它反序列化为类似 Map<String, Person> 的类型其中 PersonAddress都是一个记录。人名应该是Map中的关键.

我试过了 FSharp.DataJsonProvider , 但它为每个人提供了自己的类型,如下所示:

enter image description here

是否有库可以更好地处理这种情况?

最佳答案

如果您出于任何原因不想(或不能)使用 FSharp.Data,您也可以尝试 Thoth.Json它适用于 Fable 和普通的 .NET。在 Thoth 中,如果您的 F# 类型与使用的 JSON 非常相似,您可以使用自动编码器/自动解码器来尝试为您处理转换,或者您编写自己的编码/解码函数。

适合您的用例(如果我理解正确的话)的类型化示例(作为控制台应用程序)可能如下所示。

let testString = """
{
"Alice": {
"Age": 30,
"Address": {
"City": "New York",
"State": "NY"
}
},
"Bob": {
"Age": 6,
"Address": {
"City": "Chicago",
"State": "IL"
}
}
}
"""

open Thoth.Json.Net

type Address =
{ City : string
State : string }

type Person =
{ Age : int
Address: Address}

let decodeAddress : Decoder<Address> =
Decode.object
(fun get ->
{ City = get.Required.Field "City" Decode.string
State = get.Required.Field "State" Decode.string })

let decodePerson : Decoder<Person> =
Decode.object
(fun get ->
{ Age = get.Required.Field "Age" Decode.int
Address = get.Required.Field "Address" decodeAddress})

let decodeMap jsonString =
Decode.fromString (Decode.keyValuePairs decodePerson) jsonString
|> Result.map (fun namePersonList ->
namePersonList
|> Map.ofList)

[<EntryPoint>]
let main argv =
match decodeMap testString with
| Ok res -> printfn "%A" res
| Error e -> printfn "%s" e
0

关于json - 如何将 JSON 反序列化为 F# 中记录的映射/字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55746070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com