如何使用 cl-json(通用 lisp 库)读取 JSON 文件并将内容转换为字符串?

How to read a JSON file using cl-json (common lisp library) and convert the content to a string?

我正在使用 Common Lisp、SBCL、Emacs 和 Slime。

在 SLIME 的 REPL 中,我有一个保存文件位置的变量:

CL-USER> json-file
#P"/home/pedro/lisp/json-example.json"

文件内容为:

{"keyOne": "valueOne"}

我想读取文件里面的数据和return一个字符串:

"{"keyOne": "valueOne"}"

我该怎么做? cl-json 有名的 library 可以吗?

文档是 terse/hard。提供示例并不好。我找不到如何操作。

据我所见documentation, the API is built around streams. The function json:decode-json is taking a stream in parameter and return an association list用起来很方便

要从键中提取值,可以使用函数(assoc :key-1 assoc-list)。它将 return 一个 cons(key . value)。要获取值,需要使用cdr函数。

(defparameter json-string "{\"key-1\": \"value-1\"}")

(with-input-from-string (json-stream json-string)
  (let ((lisp-data (json:decode-json json-stream)))
    (cdr (assoc :key-1 lisp-data))))

显然,如果文件中有数据,您可以直接使用流:

(with-open-file (json-stream "myfile.json" :direction :input)
  (let ((lisp-data (json:decode-json json-stream)))
    (cdr (assoc :key-1 lisp-data))))

根据 OP

的评论进行编辑

文件内容为:

{"keyOne": "valueOne"}
I would like to read the data inside the file and return a string:
"{"keyOne": "valueOne"}"

这个问题似乎与JSON库完全无关,但是无论如何,如果需要打开一个文件并将其内容放入一个字符串中,他可以使用uiop中的一个函数。

* (uiop:read-file-string "test.txt")
"{\"keyOne\": \"valueOne\"}"

uiopASDF 附带的库,因此它可能适用于大多数 Common Lisp 的发行版。它是一种 de-facto 标准库,有很多有趣的功能。

我已经在我的电脑上进行了测试,它似乎可以工作。我可以证明在该测试期间没有数据受到损害。