Clojure JSON: исключение: com.fasterxml.jackson.core.JsonGenerationException: невозможно JSON-кодирование объекта класса:

Я пытаюсь создать узел в моем хранилище данных Neo4j, используя Clojure Neocons, и я сталкиваюсь с ошибкой, которая, по моему мнению, связана с форматированием 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 на основании сообщения об ошибке. Но я запутался, потому что я не включаю библиотеку Cheshire в файл, где происходит ошибка.

Я использую это в качестве оболочки, потому что я делаю COST POST & GET-запросы, и мне нужно вернуть JSON из моего controller.clj

(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 в моем controller.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;")

Я очень благодарен за вашу помощь в решении этого вопроса.

1 ответ

Не совсем достаточно информации. Тем не менее, это исключение часто встречается, когда чешир не распознает тип данных того, что ему было приказано кодировать как json. Ошибка выглядит так, как будто вы пытаетесь json кодировать функцию, а не выводить ее из функции? Я бы добавил println в вашу конечную точку и распечатал то, что, по вашему мнению, возвращается. Если вывод выглядит как объект функции, а не как что-то, что json может кодировать, это, вероятно, является причиной.

Что касается того, где это происходит, я предполагаю, что ваше промежуточное ПО пытается закодировать тело ответа как json.

Да, информации мало. Но, согласно вашему исключению, ясно, что чешир не знает тип recursiftion.dao_graph$create_node, поэтому он выбрасывает это исключение.

Простое решение - разобрать его на известные данные перед отправкой, например, в Чешир.

(defn my-parser
     [data]
(assoc data :index_with_not_know_type (str (:index_with_not_know_type data))))

Наблюдения: в моем случае я просто приводил значение: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))
}
))

Другие вопросы по тегам