Итерация по массиву json объектов в Clojure - PullRequest
0 голосов
/ 20 октября 2018

Я собираюсь реализовать спокойный API, используя Clojure.Для запроса GET есть URL-адрес, такой как /List, и я хочу вернуть проанализированный ответ из чистых данных, который является файлом json.Запрос GET:

(GET "/list/:from-date/:to-date" [from-date to-date]
      wrap-json-response (response (parse-object from-date to-date all-records)))

Как видите, необходимо иметь два параметра запроса from-date и to-date.Мне нужна функция с именем parse-object, которая анализирует чистые данные и сравнивает update-date с from-date и to-date.Если update-date находится между этими двумя параметрами, то возвращает его в ожидаемой структуре объекта.Ниже приведен чистый объект и структура ожидаемого объекта с данными.

Чистые данные (data.json):

[{"name": "JOHN",
  "update-date": "2017-11-10",
  "role": "admin"},
 {"name": "CHRIS",
  "update-date": "2018-04-28",
  "role": "user"},
 {"name": "ANNIE",
  "update-date": "2018-03-11",
  "role": "admin"}]

Заданные параметры: from-date: 2017-11-01 to-date: 2018-04-28

Ожидаемый возвращенный ответ:

{"users":[
     {"role":"admin",
      "shows":[
            {"name":"JOHN",
             "status":"active"}]},
      {"role":"user",
       "shows":[
            {"name":"CHRIS",
             "status":"active"}]}]}

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вот схема того, как вы могли это сделать.Я оставлю вам окончательное форматирование.

(ns tst.demo.core
  (:use tupelo.core demo.core tupelo.test)
  (:require
    [tupelo.string :as tstr] )
  (:import [java.time LocalDate]))

(def data-json
  "[{'name' : 'JOHN',
     'update-date' : '2017-11-10',
    'role' : 'admin'},
   {'name' : 'CHRIS',
     'update-date' : '2018-04-28',
    'role' : 'user'},
   {'name' : 'ANNIE',
    'update-date' : '2018-03-11',
    'role' : 'admin'}] ")

(dotest
  (let
    [date-from (LocalDate/parse "2017-11-01")
     date-to   (LocalDate/parse "2018-04-28")
     data-edn  (json->edn (tstr/quotes->double data-json))
     data-keep (vec
                 (remove nil?
                   (for [user-rec data-edn]
                     (let [update-date (LocalDate/parse (grab :update-date user-rec))]
                       (when (and
                               (.isBefore date-from update-date)   ; may need to add .isEqual
                               (.isAfter  date-to   update-date))  ; may need to add .isEqual
                         user-rec)))))]
    (spyx-pretty data-keep)))

с результатами:

---------------------------------------------
   Clojure 1.10.0-alpha8    Java 1.8.0_161
---------------------------------------------

Testing tst.demo.core
data-keep => 
[{:name "JOHN",  :update-date "2017-11-10", :role "admin"}
 {:name "ANNIE", :update-date "2018-03-11", :role "admin"}]
0 голосов
/ 21 октября 2018

Вы можете выполнять анализ / печать JSON в Clojure, используя такую ​​библиотеку, как Cheshire (https://github.com/dakrone/cheshire).

. Вы можете фильтровать данные, используя функцию filter:

(filter (fn [{:strs [update-date]}]
          (not (or (.before update-date from-date)
                   (.after update-date to-date))))
        objects)

Вы можете изменить формуданные, используя group-by:

(group-by (fn [{:strs [role]}]
            role)
          objects)

И используя выражение for:

(for [[k xs] groups]
  {"role" k
   "shows" (for [x xs]
             (select-keys x ["name" "status"]))})
...