Конвертировать из data.json в Чешир - PullRequest
0 голосов
/ 22 мая 2019

Я совершенно новичок в 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)))

Функция считывания функциональных клавиш:

(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-> messages msg)

msg - это строка json.

Однако я получаю сообщение об ошибке ниже с этой попыткой:

Ошибка выполнения (ArityException) в сообщениях tech.matterindustries.titan.ion.lambda.sqs-receive / json-> (sqs_receive.clj: 36).Неверное количество аргументов (5) передано: cheshire.core / parse-smile

1 Ответ

1 голос
/ 22 мая 2019

Вы отправляете неправильное количество аргументов на 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 выглядят так, как будто они не соответствуют ожидаемому чеширом / read-string .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...