使用Cheshire生成字符串和解析字符串解析json



我正在尝试导出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的等效性。此外,由于单元测试避开了printlnprn的问题,因此不存在由于终端上的显示格式而引起的混淆。


哦,是的,

以上是在我最喜欢的模板项目中完成的。

正如Alan Thompson所提到的,如果我们可以假设反斜杠是REPL显示数据方式的产物,那么JSON看起来是正确引用的。

柴郡的自述https://github.com/dakrone/cheshire给出了一个解析JSON并将密钥作为关键字返回的示例。显然,您在JSON参数之后直接添加了一个布尔参数true。

相关内容

  • 没有找到相关文章

最新更新