如何使用 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\"}"
uiop
是 ASDF
附带的库,因此它可能适用于大多数 Common Lisp 的发行版。它是一种 de-facto 标准库,有很多有趣的功能。
我已经在我的电脑上进行了测试,它似乎可以工作。我可以证明在该测试期间没有数据受到损害。
我正在使用 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\"}"
uiop
是 ASDF
附带的库,因此它可能适用于大多数 Common Lisp 的发行版。它是一种 de-facto 标准库,有很多有趣的功能。
我已经在我的电脑上进行了测试,它似乎可以工作。我可以证明在该测试期间没有数据受到损害。