从JSON文件数组中检索嵌套数据

从JSON文件数组中检索嵌套数据,json,clojure,Json,Clojure,我是Clojure的新手,尝试从JSON检索密钥列表。 初始数据结构是从目录中提取的JSON文件数组,下面是其中一个文件的示例(因此实际上是以下列表): 我需要得到一个单一的平面列表的“描述”值除了“交货”,只是“SKU-1074 x 1”为每个文件中的每个订单。然后,我在另一个函数中使用此列表链接到产品ID。 我之前已经半实现了这一点,但它似乎没有在一个订单上迭代所有内容,我一直在编辑以下代码以尝试实现这一点: (defn getOrders [year month day] (let [

我是Clojure的新手,尝试从JSON检索密钥列表。 初始数据结构是从目录中提取的JSON文件数组,下面是其中一个文件的示例(因此实际上是以下列表):

我需要得到一个单一的平面列表的“描述”值除了“交货”,只是“SKU-1074 x 1”为每个文件中的每个订单。然后,我在另一个函数中使用此列表链接到产品ID。 我之前已经半实现了这一点,但它似乎没有在一个订单上迭代所有内容,我一直在编辑以下代码以尝试实现这一点:

(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")