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

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

У меня есть это как моя оболочка, потому что я делаю запросы POST и GET cors, и мне нужно вернуть JSON из моего контроллера.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 в моем контроллере.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;")

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


person Benjamin McFerren    schedule 25.09.2015    source источник
comment
Вам нужно будет сделать более минимальный пример, чтобы люди могли эффективно помочь вам.   -  person Daniel Compton    schedule 26.09.2015
comment
этот пост уже получил несколько голосов, так что, похоже, есть и другие люди, у которых тоже есть такие же проблемы. Если я добавлю награду к этому вопросу, вы можете помочь?   -  person Benjamin McFerren    schedule 26.09.2015
comment
Единственный способ, которым я могу эффективно помочь, — это создать минимальный ошибочный пример, который я смогу запустить. В идеале это должно быть как здесь, так и в репозитории с открытым исходным кодом, где я могу клонировать и запускать. Было бы неплохо получить награду, но мне тоже нужно больше информации :)   -  person Daniel Compton    schedule 27.09.2015


Ответы (2)


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

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

person Tim X    schedule 27.09.2015

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

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

(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))
}
))

person Paulo Victor    schedule 13.10.2019