gpt4 book ai didi

json - 将 JSON Multiway Tree 解码为 F# Multiway Tree Discriminated Union

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

我在文档数据库中有以下 JSON 数据,我想将其解析为 F# 多路树判别联合

"commentTree": {
"commentModel": {
"commentId": "",
"userId": "",
"message": ""
},
"forest": []
}

F# 多路判别联合
type public CommentMultiTreeDatabaseModel = 
| CommentDatabaseModelNode of CommentDatabaseModel * list<CommentMultiTreeDatabaseModel>

其中 CommentMultiTreeDatabaseModel 定义为
type public CommentDatabaseModel =
{ commentId : string
userId : string
message : string
}

我正在引用 Fold / Recursion over Multiway Tree in f#广泛。我不确定从哪里开始将这样的 JSON 结构解析为 F# 多路树。任何建议将不胜感激。谢谢

最佳答案

考虑这一点的一种方法是查看构建 CommentMultiTreeDatabaseModel 所需的数据。 .它需要一个 CommentDatabaseModel以及 CommentMultiTreeDatabaseModel 的列表.所以我们需要编写如下两个函数:

let parseComment (input : JSON) : CommentDatabaseModel =
...

let parseTree (input : JSON) : CommentMultiTreeDatabaseModel =
...

但是等等, parseTree函数是我们现在正在尝试编写的函数!因此,与其编写新函数,不如用 rec 标记我们当前的函数。关键字并让它在需要的地方调用自己。

以下是如何完成的粗略示例。关键要看 parseTree它通过递归调用自身来构建数据。我用一个简单的 DU 表示了 JSON 输入数据。像 Chiron 这样的库可以产生这样的东西。

请注意,此代码一次性解析所有 JSON。此外,它不是尾递归的,所以你必须小心你的树结构有多深。
[<RequireQualifiedAccess>]
type JSON =
| String of string
| Object of (string * JSON) list
| Array of JSON list

type public CommentDatabaseModel = {
commentId : string
userId : string
message : string
}

type public CommentMultiTreeDatabaseModel =
| CommentDatabaseModelNode of CommentDatabaseModel * list<CommentMultiTreeDatabaseModel>


let parseComment = function
| JSON.Object [ "commentId", JSON.String commentId; "userId", JSON.String userId; "message", JSON.String message ] ->
{
commentId = commentId
userId = userId
message = message
}
| _ -> failwith "Bad data"

let rec parseTree (input : JSON) : CommentMultiTreeDatabaseModel =
match input with
| JSON.Object [ "commentModel", commentModel; "forest", JSON.Array forest ] ->
CommentDatabaseModelNode (parseComment commentModel, List.map parseTree forest)
| _ -> failwith "Bad data"

let parse (input : JSON) : CommentMultiTreeDatabaseModel =
match input with
| JSON.Object [ "commentTree", commentTree ] ->
parseTree commentTree
| _ -> failwith "Bad data"


let comment text =
JSON.Object [
"commentId", JSON.String ""
"userId", JSON.String ""
"message", JSON.String text
]

let sampleData =
JSON.Object [
"commentTree", JSON.Object [
"commentModel", comment "one"
"forest", JSON.Array [
JSON.Object [
"commentModel", comment "two"
"forest", JSON.Array []
]

JSON.Object [
"commentModel", comment "three"
"forest", JSON.Array []
]
]
]
]

parse sampleData

(*
val it : CommentMultiTreeDatabaseModel =
CommentDatabaseModelNode
({commentId = "";
userId = "";
message = "one";},
[CommentDatabaseModelNode ({commentId = "";
userId = "";
message = "two";},[]);
CommentDatabaseModelNode ({commentId = "";
userId = "";
message = "three";},[])])
*)

关于json - 将 JSON Multiway Tree 解码为 F# Multiway Tree Discriminated Union,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494563/

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