我将使用Clojure实现一个restful API。对于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"}]}]}发布于 2018-10-21 06:48:59
您可以在Clojure中使用诸如Cheshire (https://github.com/dakrone/cheshire)这样的库来执行JSON解析/打印。
您可以使用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"]))})发布于 2018-10-22 07:22:18
以下是您如何做到这一点的概要。我将把最终的格式化留给您。
(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"}]https://stackoverflow.com/questions/52906091
复制相似问题