我正在尝试导出json模式,以便在javascript中的Clojure之外使用。我能够生成这个:
{:type "object",
:properties {:$class {:type "string"},
:name {:type "string"},
:clauseId {:type "string"},
:$identifier {:type "string"}},
:required [:$class :name :clauseId :$identifier]}
这对Clojure 来说很好
Cheshire使用生成字符串,我可以访问:
"{
"type" : "object",
"properties" : {
"$class" : {
"type" : "string"
},
"name" : {
"type" : "string"
},
"clauseId" : {
"type" : "string"
},
"$identifier" : {
"type" : "string"
}
},
"required" : [ "$class", "name", "clauseId", "$identifier" ]
}"
这基本上就是我想要的,但没有引号。我在上面尝试了从Cheshire解析字符串,得到了:
{"type" "object",
"properties" {"$class" {"type" "string"},
"name" {"type" "string"},
"clauseId" {"type" "string"},
"$identifier" {"type" "string"}},
"required" ["$class" "name" "clauseId" "$identifier"]}
更近了,但它去掉了柱廊。我想要
{"type" : "object",
"properties" : {"$class" : {"type" "string"},
"name" : {"type" "string"},
"clauseId" : {"type" "string"},
"$identifier" : {"type" "string"}},
"required" : ["$class" "name" "clauseId" "$identifier"]}
我觉得这应该很容易,我错过了一些东西。如果没有:,我看不出它是如何有效的json
如何使用冒号创建json?
我认为打印命令是这里混乱的根源。你没有在你的问题中表明这一点。
另一个混淆点是将JSON打印为"JSON";源";或";数据";。在后者中,JSON字符串必须具有转义的双引号。在JS源代码中,这些都不存在。
一个例子:
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require [tupelo.string :as str]))
(dotest
(let [edn-data {:a 1 :b [2 "three"]}
json-str (edn->json edn-data)]
(println :a edn-data) ; prints w/o double-quotes
(prn :b edn-data) ; prints with double-quotes, as if source code
(newline)
(println :c json-str)
(prn :d json-str)
结果
-----------------------------------
Clojure 1.10.3 Java 15.0.2
-----------------------------------
Testing tst.demo.core
:a {:a 1, :b [2 three]}
:b {:a 1, :b [2 "three"]}
:c {"a":1,"b":[2,"three"]}
:d "{"a":1,"b":[2,"three"]}"
函数edn->json
来自Tupelo库,但与Cheshire lib等人的相似
请参阅此Clojure文档来源列表,特别是Clojure CheatSheet。
如果我们继续,我们可以看到一些处理JSON数据的好技巧:
(let [json-single (str/quotes->single json-str)
json-literal "{'a':1,'b':[2,'three']}"
json-double (str/quotes->double json-literal)
edn-data2 (json->edn json-double)]
(is= json-single json-literal)
(is= json-double json-str)
(is= edn-data edn-data2))
))
在Clojure源代码中使用JSON字符串的根本问题是,它是一个字符串,需要双引号才能写成字符串文字。这意味着内部双引号需要转义,这是丑陋的&容易出错。
我们可以避免这个问题,因为我们只需编写JSON";文字";使用单引号,如变量json-literal
所示。然后,我们可以使用函数tupelo.string/quotes->double
将字符串中的单引号转换为双引号。
单元测试显示了这与原始JSON的等效性。此外,由于单元测试避开了println
与prn
的问题,因此不存在由于终端上的显示格式而引起的混淆。
哦,是的,
以上是在我最喜欢的模板项目中完成的。
正如Alan Thompson所提到的,如果我们可以假设反斜杠是REPL显示数据方式的产物,那么JSON看起来是正确引用的。
柴郡的自述https://github.com/dakrone/cheshire给出了一个解析JSON并将密钥作为关键字返回的示例。显然,您在JSON参数之后直接添加了一个布尔参数true。