gpt4 book ai didi

json - 从 json 文本文件创建树 - Clojure

转载 作者:行者123 更新时间:2023-12-02 04:28:49 25 4
gpt4 key购买 nike

我有一个文本文件,每行包含一个 json 值。我的文件如下:

{"id":"a","family":"root","parent":nil,"value":"valueofa"}
{"id":"b1","family":"b","parent":"a","value":"valueofb1"}
{"id":"c1","family":"c","parent":"b1","value":"valueofc1"}
{"id":"c2","family":"c","parent":"b1","value":"valueofc2"}
{"id":"b2","family":"b","parent":"root","value":"valueofb2"}
{"id":"d1","family":"d","parent":"b1","value":"valueofd1"}

在上面给出的 json 中,我们的 family 属性表示层次结构,我们将“root”作为根,“b”作为“root”的子级,“c”作为“b”和“的子级” d”也将是“b”的子代。

这个想法是迭代文件并将正在读取的节点添加到树中的适当位置。一种方法是将这些条目读入“映射”,然后使用该映射进行任何树操作。对于任何复杂的树操作,我不确定这将如何工作。很有可能,根据某种要求,我可能必须将子级与现有父级分离并将其附加到另一个父级。显然 Clojure zipper 应该在这方面有所帮助,但我对 zipper 中节点的层次结构如何工作感到有点困惑。

如果有人能在这里指出我正确的方向,那就太好了。

最佳答案

这是几个问题,可能太宽泛,但这是一个示例。

  1. 如何读取文件?

    (def file-contents (slurp "foo.txt"))`
  2. 如何将 JSON 转换为 Clojure 数据?

    (require '[cheshire.core :refer [parse-string]])`

    (def data (map #(parse-string % true)
    (clojure.string/split file-contents #"\n")))
  3. 如何将具有父引用的列表视为一棵树?

    (require '[clojure.zip :as z])

    (defn create-zipper [s]
    (let [g (group-by :parent s)]
    (z/zipper g #(map :id (g %)) nil (-> nil g first :id))))

    (def t (create-zipper data))

    参见how to transform a seq into a tree

  4. 如何使用 zipper ?

    user=> (-> t z/node)
    "a"
    user=> (-> t z/children)
    ("b1")
    user=> (-> t z/down z/node)
    "b1"
    user=> (-> t z/down z/children)
    ("c1" "c2" "d1")
    user=> (-> t z/down z/down z/rightmost z/node)
    "d1"

关于json - 从 json 文本文件创建树 - Clojure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24855595/

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