不寻常的语法JSON解析问题字符串(Clojure)

问题描述 投票:1回答:2

我有一个代表JSON的长clojure String(java.lang.String)。它具有“正常”的语法,如下所示:

"{ a:1, b:"hello" }"

密钥周围没有引号。

我查看的所有库如clojure.data.json都需要这种语法才能解析为一个对象:

"{\"a\":1,\"b\":"hello"}"

有没有办法将顶级语法解析为json或clj对象?任何帮助表示赞赏。谢谢。

json string syntax clojure
2个回答
4
投票

根据您的绝望程度,Groovy JSON Slurper可以在LAX设置中读取此“JSON”(允许这些属性,注释......)

添加以下dep:

[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
投票

Update 2019-3-21

来自@jas的链接包含一个“看起来像YAML”的注释(如果冒号后跟一个空格)。

我已将新的snakeyaml-engine库集成到the Tupelo Library中。 API docs 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项目提出了一个更新其依赖项的问题。

© www.soinside.com 2019 - 2024. All rights reserved.