gpt4 book ai didi

json - F# 将 JSON 反序列化为字符串或节点

转载 作者:行者123 更新时间:2023-12-04 17:46:41 26 4
gpt4 key购买 nike

我有一些我试图反序列化的 JSON 数据,如下所示:

{[{ 
"node":"xyz",
"type":"string"
},
{
"node":{ "moredata":"values", "otherdata":"values2" },
"type":"node"
}]}

我希望能够将其序列化为 F# 类,但它当前失败,因为节点字段可以更改类型。有谁知道处理这个问题的好方法?我假设我希望节点字段类似于 JsonNode 类型?
我目前正在使用 Newtonsoft,但如果其中一个库有更好的解决方案,我也愿意使用其他库。

编辑:不幸的是,我不能使用类型提供程序,因为我希望它可以从 C# 中使用。

最佳答案

您可以使用 JSON Type Provider .它了解异构节点类型。这是来自 OP 的 JSON(已更正,因此它是有效的 JSON),用作定义类型的示例:

open FSharp.Data

type MyJson = JsonProvider<"""{
"arr": [
{
"node": "xyz",
"type": "string"
},
{
"node": {
"moredata": "values",
"otherdata": "values2"
},
"type": "node"
}
]
}""">

您现在可以通过调用 MyJson.Parse 创建该类型的值。 ,但如果你只想查看用作推断类型的示例的 JSON,你也可以使用 GetSample :
let json = MyJson.GetSample()

现在您可以开始探索数据了。这是 FSI session :
> json.Arr;;
val it : JsonProvider<...>.Arr [] =
[|{
"node": "xyz",
"type": "string"
};
{
"node": {
"moredata": "values",
"otherdata": "values2"
},
"type": "node"
}|]

> json.Arr |> Array.map (fun x -> x.Node);;
val it : JsonProvider<...>.StringOrNode [] =
[|"xyz"; {
"moredata": "values",
"otherdata": "values2"
}|]

如您所见,每个 NodeStringOrNode值,您可以这样访问:
> json.Arr |> Array.map (fun x -> x.Node.Record) |> Array.choose id;;
val it : JsonProvider<...>.Node [] =
[|{
"moredata": "values",
"otherdata": "values2"
}|]

x.Node.Recordoption ,您只能选择 Some 的那些与 Array.choose .

您可以以同样的方式获取字符串:
> json.Arr |> Array.map (fun x -> x.Node.String) |> Array.choose id;;
val it : string [] = [|"xyz"|]

关于json - F# 将 JSON 反序列化为字符串或节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32226792/

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