我有一个长的clojure字符串(java.lang.String),它表示一个JSON。它具有“正常”外观的语法,如下所示:
"{ a:1, b:"hello" }"
键周围没有引号。
我看过的所有库,例如clojure.data.json都需要此语法以便解析为对象:
"{\"a\":1,\"b\":"hello"}"
是否可以将顶级语法解析为json或clj对象?任何帮助表示赞赏。谢谢。
答案 0 :(得分:4)
根据您的绝望程度,Groovy JSON Slurper可以在LAX
设置(允许这些属性,注释等)中读取此“ JSON”
添加以下内容:
[org.codehaus.groovy/groovy-json "2.5.6"]
然后您可以运行:
user=> (import [groovy.json JsonSlurper JsonParserType])
groovy.json.JsonParserType
user=> (def parser (doto (JsonSlurper.) (.setType JsonParserType/LAX)))
#'user/parser
user=> (def data (.parseText parser "{ a:1, b:\"hello\" }"))
#'user/data
user=> data
{"a" 1, "b" "hello"}
答案 1 :(得分:1)
@jas中的链接包含“看起来像YAML”的注释(如果冒号后跟一个空格)。
我已经将新的snakeyaml-engine库集成到the Tupelo Library中。 API文档are here。答案现在非常简单:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test)
(:require [tupelo.parse.yaml :as yaml] ))
(dotest
(let [data-1 "{ a: 1, b: 'Hello World' }"]
(is= (yaml/parse data-1) {:a 1, :b "Hello World"})))
给出project.clj
[io.forward/yaml "1.0.9"]
这有效:
(ns tst.demo.core
(:require [yaml.core :as yaml]) )
(def data-1 "{ a: 1, b: \"Hello World\" }" )
(let [result-raw (yaml/parse-string data-1)
result (into {} result-raw)]
有结果
----------------------------------
Clojure 1.10.0 Java 10.0.1
----------------------------------
Testing tst.demo.core
result-raw => #ordered/map ([:a 1] [:b "Hello World"])
result => {:a 1, :b "Hello World"}
不幸的是,它(当前)在Java 11下失败了,因为从属库需要类型提示。您可以通过修正project.clj
来解决此问题:
:dependencies [
[io.forward/yaml "1.0.9" :exclusions [org.flatland/ordered
org.yaml/snakeyaml] ]
[org.yaml/snakeyaml "1.23"]
[org.flatland/ordered "1.5.7"]
[org.clojure/clojure "1.10.0"]
我对io.forward/yaml
项目提出了问题,以更新其依赖性。