Необычный синтаксис проблемы синтаксического анализа JSON String (Clojure) - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть длинная строка Clojure (java.lang.String), представляющая JSON.Он имеет «нормальный» синтаксис, подобный следующему:

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

Ключи не имеют кавычек вокруг них.

Все библиотеки, которые я просматривал, такие как clojure.data.json хочет этот синтаксис для анализа в объекте:

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

Есть ли способ синтаксического разбора верхнего синтаксиса на объекты json или clj?Любая помощь приветствуется.Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

В зависимости от вашего уровня отчаяния Groovy JSON Slurper может прочитать этот «JSON» в настройке LAX (которая допускает эти атрибуты, комментарии, ...)

Добавить следующее деп:

[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"}
0 голосов
/ 26 февраля 2019

Обновление 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, чтобы обновить их зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...