我的项目使用读/写库解析JSON,该库称为:
我遇到了问题,试图使解码(func)正常工作,所以我开始搞砸了:
我的JSON包含的数据包含一个名为“ zone”的字段,该字段包含一个内部带有:keys的向量,例如{:zone:[:hand:table]},该向量存储在存储在向量中的字符串中,如下所示: {“ zone”:[“ hand”“ table”]}
所以我想出了如何使用以下方法转换样本数据:
(mapv keyword {"zone" : ["hand"]})
那太好了,然后我需要弄清楚如何为柴郡实现一个解码器,我无法按照自己的逻辑来做到这一点,我只花了一个小时的时间来完成这项工作,但是我一直在使用data.json,而且我认为解码器功能相对容易。
我的项目可以工作,下面是一些示例代码:
(ns clojure-noob.core (:require
[cheshire.core :refer [decode]]
[clojure.data.json :as j-data]
) (:gen-class))
(defn -main
"I don't do a whole lot ... yet."
[& args]
)
这正在使用柴郡:
(let [init (decode "{\"zone\" : [\"hand\"]}" true
(fn [field-name]
(if (= field-name "zone")
(mapv keyword [])
[])))]
(println (str init)))
这正在使用data.json:
(defn my-value-reader [key value]
(if (= key :zone)
(mapv keyword value)
value))
(let [init (j-data/read-str
"{\"zone\" : [\"hand\"]}"
:value-fn my-value-reader
:key-fn keyword)]
(println (str init)))
我希望从控制台获得这两个的最底结果:
{:zone ["hand"]}
{:zone [:hand]}
问题是我想用柴郡来做这个 ps。我在看柴郡的工厂区吗?也许这更容易?
答案 0 :(得分:0)
我会同意@TaylorWood。不要搞乱解码器,只需一次咬一口即可。首先,解析json。其次,转换结果。
(def data "{\"zone\" : [\"hand\"]}")
(-> data
(cheshire.core/decode true)
(update-in ["zone"] (partial mapv keyword)))
#=> {:zone [:hand]}
答案 1 :(得分:0)
我建议您使用schema.tools
之类的工具来强制输入。您可以添加第二遍尝试,以尝试将JSON字符串强制转换为更丰富的Clojure类型。
这里有一些示例代码!
;; require all the dependencies. See links below for libraries you need to add
(require '[cheshire.core :as json])
(require '[schema.core :as s])
(require '[schema.coerce :as sc])
(require '[schema-tools.core :as st])
;; your data (as before)
(def data "{\"zone\" : [\"hand\"]}")
;; a schema that wants an array of keywords
(s/defschema MyData {:zone [s/Keyword]})
;; use `select-schema` along with a JSON coercion matcher
(-> data
(json/decode true)
(st/select-schema MyData sc/json-coercion-matcher))
;; output: {:zone [:hand]}
使用defschema
定义所需的数据形状为您提供了一种通用的解决方案,可以序列化为JSON,同时充分利用Clojure的值类型的优势。您的架构没有明确地“完成”转换工作,而是描述了预期的结果,并希望强制性可以做正确的事!
链接到库: -https://github.com/plumatic/schema -https://github.com/metosin/schema-tools#coercion
注意:您可以使用metosin/spec-tools对clojure.spec做类似的事情。查看他们的自述文件以获取帮助。