从JSON文件数组中检索嵌套数据
我是Clojure的新手,尝试从JSON检索密钥列表。 初始数据结构是从目录中提取的JSON文件数组,下面是其中一个文件的示例(因此实际上是以下列表): 我需要得到一个单一的平面列表的“描述”值除了“交货”,只是“SKU-1074 x 1”为每个文件中的每个订单。然后,我在另一个函数中使用此列表链接到产品ID。 我之前已经半实现了这一点,但它似乎没有在一个订单上迭代所有内容,我一直在编辑以下代码以尝试实现这一点:从JSON文件数组中检索嵌套数据,json,clojure,Json,Clojure,我是Clojure的新手,尝试从JSON检索密钥列表。 初始数据结构是从目录中提取的JSON文件数组,下面是其中一个文件的示例(因此实际上是以下列表): 我需要得到一个单一的平面列表的“描述”值除了“交货”,只是“SKU-1074 x 1”为每个文件中的每个订单。然后,我在另一个函数中使用此列表链接到产品ID。 我之前已经半实现了这一点,但它似乎没有在一个订单上迭代所有内容,我一直在编辑以下代码以尝试实现这一点: (defn getOrders [year month day] (let [
(defn getOrders [year month day]
(let [fs (filter #(.isFile %) (file-seq (clojure.java.io/file (str "data/orders/" year "/" month "/" day))))
ordersData (map #(json/read-str (slurp %) :key-fn keyword) fs)
getLines (fn [x] (map :lines x))
getDescription (fn [x] (map #(get % :description)))]
;(for [x (map #(getLines %) ordersData)] (remove #{"Delivery"} (map #(get % :description) x)))
(->> (for [x ordersData] (for [y x] (for [z y] z)))
(map (fn [x] (map (fn [y] y) x))) ;Tried many different maps/fors here
)
)
)
尝试了多次迭代该代码,主要使用嵌套映射、for和匿名函数,但我能返回的似乎只是一个nil值列表
下面从ordersData映射中检索第一个订单的行,但是我不知道如何在这个级别进行迭代。在命令式语言中,我可能会使用嵌套循环,但不能完全确定
(get (first (first (getOrders "2017" "09" "07"))) :lines)
下面是一个相当简单的方法:
(def my-maps (json/read-str "json goes here"))
定义将在JSON中的每个顶级映射上操作的函数:
(defn descriptions [m]
(->> (get m "lines") ;; get the lines from the map
(map #(get % "description")) ;; get the description values
(remove #{"Delivery"}))) ;; remove any "Delivery" values
这个descriptions
函数可能更有效,但我认为这是一个很好的解释性示例
然后map
将函数映射到JSON映射上:
(map descriptions my-maps)
=> (("SKU-1079 x 1")
("SKU-1003 x 1" "SKU-1015 x 1" "SKU-1086 x 1" "SKU-1029 x 1" "SKU-1074 x 1"))
要获得所需的完全平面列表,请将该map
替换为mapcat
:
(mapcat descriptions my-maps)
=> ("SKU-1079 x 1" "SKU-1003 x 1" "SKU-1015 x 1" "SKU-1086 x 1" "SKU-1029 x 1" "SKU-1074 x 1")
我在这方面遇到的问题是:ordersData(map#)(json/read str(slurp%):key fn关键字)fs作为地图数据,我试着稍微修改一下你的代码,但是我得到的只是空列表iteration@J.Greenfield我用你的问题中的JSON写了这个例子,它似乎只是你的一个文件,所以是的,我认为你只需要添加另一个迭代级别。非常感谢,伙计通过首先展平以避免嵌套迭代,并将get中的字符串更改为:关键字,使其工作。
(mapcat descriptions my-maps)
=> ("SKU-1079 x 1" "SKU-1003 x 1" "SKU-1015 x 1" "SKU-1086 x 1" "SKU-1029 x 1" "SKU-1074 x 1")