簡體   English   中英

語法異常JSON分析問題字符串(Clojure)

[英]Unusual syntax JSON parse problem String (Clojure)

我有一個很長的Clojure字符串(java.lang.String),它表示一個JSON。 它具有“正常”外觀的語法,如下所示:

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

鍵周圍沒有引號。

我查看過的所有庫(例如clojure.data.json)都希望使用此語法來解析為一個對象:

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

有沒有一種方法可以將頂級語法解析為json或clj對象? 任何幫助表示贊賞。 謝謝。

根據您的絕望程度,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"}

更新2019-3-21

@jas的鏈接包含“看起來像YAML”的注釋(如果冒號后跟一個空格)。

我已經將新的snakeyaml-engine庫集成到Tupelo庫中 API文檔在這里 答案現在非常簡單:

(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項目提出了問題,以更新其依賴性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM