Clojure嵌套json响应

如何解决Clojure嵌套json响应

我是Clojure的新手,我正在尝试制作一个具有3个端点的简单API。 我正在尝试实现一个端点,该端点将接受查询的每一行并将其放入json。 所以我有一个SQLite数据库。这些是我的条目,例如:

{:timestamp 2020-09-11 14:29:30,:lat 36.0,:long 36.0,:user michav}
{:timestamp 2020-09-11 14:31:47,:user michav}

所以我想要一个如下的json响应:

{:get
    :status 200
    :body {:timestamp "2020-09-11 14:29:30" 
           :lat 36.0 
           :long 36.0
           :user "michav"}
          {:timestamp "2020-09-11 14:31:47" 
           :lat 36.0 
           :long 36.0
           :user "michav"}
   }

} 这是我正在尝试修复的代码,以获得上述结果。

(def db
    {:classname   "org.sqlite.JDBC"
     :subprotocol "sqlite"
     :subname     "db/database.db"
    }) 
 
 (defn getparameter [req pname] (get (:params req) pname))

 (defn output
    "execute query and return lazy sequence"
    []
    (query db ["select * from traffic_users"]))

 (defn print-result-set
    "prints the result set in tabular form"
    [result-set]
    (doseq [row result-set]
        (println row)))

  (defn request-example [req]
    (response {:get {:status 200 
                     :body  (-> (doseq [row output]
                                {:timestamp  (getparameter row :timestamp) :lat  (getparameter row :lat) :long  (getparameter row :long) :user  (getparameter row :user)} ))
                     }}))
  
(defroutes my_routes
    (GET "/request" [] request-example)
    (route/resources "/"))

(def app (-> #'my_routes wrap-cookies wrap-keyword-params wrap-params wrap-json-response))

我遇到的错误如下:

java.lang.IllegalArgumentException: Don't know how to create ISeq from: mybank.core$output
                             RT.java:557 clojure.lang.RT.seqFrom
                             RT.java:537 clojure.lang.RT.seq
                            core.clj:137 clojure.core/seq
                            core.clj:137 clojure.core/seq
                             core.clj:65 mybank.core/request-example[fn]
                             core.clj:65 mybank.core/request-example
                             core.clj:63 mybank.core/request-example
                         response.clj:47 compojure.response/eval1399[fn]
                          response.clj:7 compojure.response/eval1321[fn]
                            core.clj:158 compojure.core/wrap-response[fn]
                            core.clj:128 compojure.core/wrap-route-middleware[fn]
                            core.clj:137 compojure.core/wrap-route-info[fn]
                            core.clj:146 compojure.core/wrap-route-matches[fn]
                            core.clj:185 compojure.core/routing[fn]
                           core.clj:2701 clojure.core/some
                           core.clj:2692 clojure.core/some
                            core.clj:185 compojure.core/routing
                            core.clj:182 compojure.core/routing
                         RestFn.java:139 clojure.lang.RestFn.applyTo
                            core.clj:667 clojure.core/apply
                            core.clj:660 clojure.core/apply
                            core.clj:192 compojure.core/routes[fn]
                            Var.java:384 clojure.lang.Var.invoke
                         cookies.clj:171 ring.middleware.cookies/wrap-cookies[fn]
                   keyword_params.clj:32 ring.middleware.keyword-params/wrap-keyword-params[fn]
                           params.clj:57 ring.middleware.params/wrap-params[fn]
                             json.clj:42 ring.middleware.json/wrap-json-response[fn]
                            Var.java:384 clojure.lang.Var.invoke
                           reload.clj:18 ring.middleware.reload/wrap-reload[fn]
                       stacktrace.clj:17 ring.middleware.stacktrace/wrap-stacktrace-log[fn]
                       stacktrace.clj:80 ring.middleware.stacktrace/wrap-stacktrace-web[fn]
                            jetty.clj:27 ring.adapter.jetty/proxy-handler[fn]
                        (Unknown Source) ring.adapter.jetty.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle
                 HandlerWrapper.java:127 org.eclipse.jetty.server.handler.HandlerWrapper.handle
                         Server.java:500 org.eclipse.jetty.server.Server.handle
                    HttpChannel.java:386 org.eclipse.jetty.server.HttpChannel.lambda$handle$1
                    HttpChannel.java:562 org.eclipse.jetty.server.HttpChannel.dispatch
                    HttpChannel.java:378 org.eclipse.jetty.server.HttpChannel.handle
                 HttpConnection.java:270 org.eclipse.jetty.server.HttpConnection.onFillable
             AbstractConnection.java:311 org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded
                   FillInterest.java:103 org.eclipse.jetty.io.FillInterest.fillable
                ChannelEndPoint.java:117 org.eclipse.jetty.io.ChannelEndPoint$2.run
                 EatWhatYouKill.java:336 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask
                 EatWhatYouKill.java:313 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce
                 EatWhatYouKill.java:171 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce
                 EatWhatYouKill.java:135 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce
               QueuedThreadPool.java:806 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob
               QueuedThreadPool.java:938 org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run
                        (Unknown Source) java.lang.Thread.run

解决方法

您的错误在此行上:

(doseq [row output] ...

错误消息

Don't know how to create ISeq from: mybank.core$output

提供了线索。变量output是函数,而不是doseq期望的序列。您本打算调用output函数,所以需要使用括号来创建函数调用,例如:

(doseq [row (output)] ...

更新

您需要包括一个外部库以在EDN数据和JSON字符串之间进行转换。我最喜欢的方式是我自己的库Tupelo Clojure。像这样使用它:

(ns tst.demo.core
  (:use tupelo.core tupelo.test))

(let [data [{:timestamp "2020-09-11 14:29:30",:lat 36.0,:long 36.0,:user "michav"}
            {:timestamp "2020-09-11 14:31:47",:user "michav"}]]
  (println (edn->json data)))

结果:

[{"timestamp":"2020-09-11 14:29:30","lat":36.0,"long":36.0,"user":"michav"},{"timestamp":"2020-09-11 14:31:47","user":"michav"}]

您的project.clj中将需要以下行:

[tupelo "20.08.27"] 

also see this template project,以轻松入门。享受吧!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-