【问题标题】:Unusual syntax JSON parse problem String (Clojure)异常语法 JSON 解析问题 String (Clojure)
【发布时间】:2019-02-25 19:32:08
【问题描述】:

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

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

键周围没有引号。

我看过的所有库,例如clojure.data.json,都需要这种语法来解析成一个对象:

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

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

【问题讨论】:

  • 这本身不是 clojure 的解决方案,所以不是重复的,但可能会给你一些想法:stackoverflow.com/questions/2060356/…
  • 这不是有效的 JSON,而是一个 JavaScript 对象。当您在 jsonlint.com 这样的验证器中尝试时,您会注意到。
  • 不幸的答案是你必须自己解析它。唯一(更好)的答案是让源来为您提供有效的 JSON。

标签: json string syntax clojure


【解决方案1】:

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

添加以下部门:

[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"}

【讨论】:

  • 不错!我不知道 Clojure 可以使用它。
  • 它只是一个 jar 中的 .class 文件... :)
【解决方案2】:

2019 年 3 月 21 日更新

来自@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 项目提交了一个问题,以更新它们的依赖关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多