我正在尝试使用clojure neocons在我的Neo4j数据存储中创建一个节点,并且遇到与格式化json有关的错误:
Exception: com.fasterxml.jackson.core.JsonGenerationException: Cannot JSON encode object of class: class recursiftion.dao_graph$create_node: recursiftion.dao_graph$create_node@32693b5
generate.clj:148 cheshire.generate/generate
generate.clj:119 cheshire.generate/generate
core.clj:31 cheshire.core/generate-string
core.clj:21 cheshire.core/generate-string
cypher.clj:51 clojurewerkz.neocons.rest.cypher/query
core.clj:2440 clojure.core/comp[fn]
dao_graph.clj:428 recursiftion.dao-graph/create-node
model.clj:131 recursiftion.model/createNode
controller.clj:206 recursiftion.controller/fn
core.clj:99 compojure.core/make-route[fn]
core.clj:45 compojure.core/if-route[fn]
core.clj:30 compojure.core/if-method[fn]
core.clj:112 compojure.core/routing[fn]
core.clj:2570 clojure.core/some
core.clj:112 compojure.core/routing
RestFn.java:139 clojure.lang.RestFn.applyTo
core.clj:632 clojure.core/apply
core.clj:117 compojure.core/routes[fn]
keyword_params.clj:32 ring.middleware.keyword-params/wrap-keyword-params[fn]
...
根据错误报告,我怀疑这可能与柴郡有关。但是我很困惑,因为我没有在发生错误的文件中包含Cheshire库。
我将其作为包装器,因为我正在进行cors POST&GET请求,并且需要从controller.clj返回JSON。>
(def app (-> (handler/api app-routes) (middleware/wrap-json-body {:keywords? true}) (middleware/wrap-json-response) (wrap-cors routes #"^http://localhost:9000$")))
下面是在我的controller.clj中引用的库
(ns recursiftion.controller (:use [ring.adapter.jetty :only [run-jetty]] [recursiftion.websocket :only [wamp-handler]] [recursiftion.config :only [conf]] ) (:require [compojure.core :refer :all] [compojure.handler :as handler] [compojure.route :as route] [clojure.java.io :as io] [ring.util.io :refer [string-input-stream]] [ring.util.response :as resp] [ring.util.response :refer [response]] [ring.middleware.json :as middleware] [ring.middleware.cors :refer [wrap-cors]] [environ.core :refer [env]] [cheshire.core :refer :all] [recursiftion.model :as model] [monger.json] [clojure.pprint :refer [pprint]]))
这是我的控制器中的POST端点代码。clj
(POST "/node/create" request (let [node_object (or (get-in request [:params :data]) (get-in request [:body :data]) "1ROUTER_ERROR")] {:status 200 :headers {"Content-Type" "application/json"} :body (recursiftion.model/createNode node_object) } ))
这里是通过我的模型的引用库,可在dao_graph.clj中找到
(ns recursiftion.dao_graph (:require [clojure.string] [clojurewerkz.neocons.rest :as nr] [clojurewerkz.neocons.rest.cypher :as cy] [clojure.pprint :refer [pprint]]) (:import [org.bson.types.ObjectId]) )
这里是在dao_graph.clj内部调用的函数的定义:
(defn create-node [ nodeobj ] (let [ _nodeobj nodeobj ] (cy/tquery conn create-node { :_nodetype (get-in _nodeobj [:type]) })))
这是密码查询,返回以“ ...”为键的映射
<< [(def create-node "CREATE (m:{_nodetype}) RETURN M;")
非常感谢您为解决此问题所提供的帮助。
(defn my-parser
[data]
(assoc data :index_with_not_know_type (str (:index_with_not_know_type data))))
Obs:就我而言,我只是将:index_with_not_know_type值转换为字符串
然后,根据您的情况,您可以执行以下操作
(POST "/node/create" request (let [node_object (or (get-in request [:params :data]) (get-in request [:body :data]) "1ROUTER_ERROR")] {:status 200 :headers {"Content-Type" "application/json"} :body (-> (recursiftion.model/createNode node_object) (my-parser)) } ))