Конвертировать из data.json в Чешир
Я совершенно новичок в Clojure. Я до сих пор иногда борюсь с функциями чтения.
Я пытаюсь изменить эту функцию, чтобы использовать чекшир. Вот моя попытка:
defn- json->messages [json]
(let [records (:amazon.aws.sqs/records (cheshire/decode
json
:key-fn key-reader
:value-fn value-reader))
add-origin-queue (fn [record]
(let [event-source-arn (:amazon.aws.sqs/event-source-arn record)
queue-name (arn->queue-name event-source-arn)]
(assoc record :amazon.aws.sqs/queue-name queue-name)))]
(map add-origin-queue records)))
Функция key-reader:
(def ^:private
key-reader
(memoize (fn [key]
(let [kebab-key (if (= "md5OfBody" key)
"md5-of-body"
(csk/->kebab-case key))]
(keyword "amazon.aws.sqs" kebab-key)))))
Функция:
(def ^:private
value-reader
(memoize (fn [key value]
(if (= key :amazon.aws.sqs/receipt-handle)
value-reader
value))))
Я тогда вызываю функцию так:
(json-> сообщения msg)
msg является строкой json.
Однако я получаю ошибку ниже с этой попыткой:
Ошибка выполнения (ArityException) на tech.matterindustries.titan.ion.lambda.sqs-receive/json->messages (sqs_receive.clj:36). Неверное количество аргументов (5) передано: cheshire.core/parse-smile
1 ответ
Вы отправляете неверное количество аргументов cheshire.core/parse-smile
, У вас есть образец данных?
Пожалуйста, также сохраняйте ваш код чистым и отформатированным, например так:
(defn- json->messages
[json]
(let [records (:amazon.aws.sqs/records (cheshire/decode json :key-fn key-reader :value-fn value-reader))
add-origin-queue (fn [record]
(let [event-source-arn (:amazon.aws.sqs/event-source-arn record)
queue-name (arn->queue-name event-source-arn)]
(assoc record :amazon.aws.sqs/queue-name queue-name)))]
(map add-origin-queue records)))
Я не мог найти decode
в чеширских документах, но в источнике это так:
(def decode "Alias to parse-string for clojure-json users" parse-string)
Я разочарован в их неполных документах.
Быстрый Google показывает документы:
(parse-string string & [key-fn array-coerce-fn])
Returns the Clojure object corresponding to the given JSON-encoded string.
An optional key-fn argument can be either true (to coerce keys to keywords),
false to leave them as strings, or a function to provide custom coercion.
The array-coerce-fn is an optional function taking the name of an array field,
and returning the collection to be used for array values.
Это может быть не ясно. Что это означает, что есть 3 законных способа позвонить parse-string
:
(parse-string <json-str>)
(parse-string <json-str> <key-fn>)
(parse-string <json-str> <key-fn> <array-coerce-fn>)
Таким образом, вы можете назвать это с 1, 2 или 3 аргументами. Вы не можете добавить в :key-fn
или же :value-fn
ключи карты, как в вашем примере.
Пожалуйста, обратите внимание, что ваш key-reader
а также value-reader
похоже, что они не соответствуют ожиданиям cheshire/read-string.