大家早上好,
要完成这个项目,我需要你的帮助。
所以现在我试图创建两个函数来读取/写入lisp文件。
这是描述函数必须如何工作的原因
(json-load filename) -> JSON
(json-write JSON filename) -> filename
The json-load function opens the file filename returns a JSON object (or generates an error). If
filename does not exist the function generates an error. The suggestion is to read the whole file in one
string and then to call json-parse.
The json-write function writes the JSON object to the filename file in JSON syntax. If
filename does not exist, it is created and if it exists it is overwritten. Of course it is expected that
CL-PROMPT> (json-load (json-write '(json-obj # | stuff | #) "foo.json"))
(json-obj # | stuff | #)
这是我的json-load函数
(defun json-load (filename)
(with-open-file (file-stream filename)
(let ((file-contents (make-string (file-length file-stream))))
(read-sequence file-contents file-stream)
file-contents)) (json-parse (file-contents)))
但它不起作用
我也需要一些帮助来编写函数。
谢谢你们
编辑1:
(defun json-load (filename)
(with-open-file (in filename
:direction :input
:if-does-not-exist :error)
(file-get-contents filename))
(json-parse filename))
(defun file-get-contents (filename)
(with-open-file (stream filename)
(let ((contents (make-string (file-length stream))))
(read-sequence contents stream)
contents)))
所以函数应该不远处是正确的,但我认为问题是file-get-contents函数。 我认为,因为如果我运行此函数输出是
"\"{\\\"nome\\\" : \\\"Arthur\\\",\\\"cognome\\\" : \\\"Dent\\\"}\""
因此json-parse不再识别json-object。 有什么想法吗?
编辑2:
我尝试两种功能,但结果相同。如果我在文件中使用相同的json-object调用json-parse它可以,但是如果我调用json-load lisp用我自己的错误消息回复我"未定义的JSON对象(json-parse)& #34 ;. 为什么呢?
编辑3:
这是json-write函数,但是现在它还没有用。
(defun json-write (json filename)
(with-open-file (out filename
:direction :output
:if-exists :overwrite
:if-does-not-exist :create)
(pprint (json out))))
所以帖子开头的描述说json-write函数用JSON语法将JSON对象写入文件名文件。 现在,2个问题
1)我的功能部分正确吗?
2)如何用Json语法编写Json对象?
由于
答案 0 :(得分:0)
我正在研究同一个项目,希望教授不介意我们分享信息;) 这是我采取的方法:
(defun json-load (filename)
(with-open-file (in filename
:direction :input
:if-does-not-exist :error)
(multiple-value-bind (s) (make-string (file-length in))
(read-sequence s in)
(json-parse s))))
请记住,read-sequence
会覆盖给定的序列,在本例中为s
。我正在使用multiple-value-bind
,因此我不必同时使用变量声明和lambda函数(尽管它只是(let ((v form)) ...))
的一个较不惯用的版本,正如@tfb所指出的那样。 / p>