gpt4 book ai didi

lisp 中的 json-get 函数

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:33 27 4
gpt4 key购买 nike

最近我正在使用 prolog 和 lisp 进行 json 解析。昨天在你的帮助下我完成了 prolog 项目,现在我再次需要帮助。

函数始终是 json-get 但现在是 lisp。

这是我写的函数:

(defun json-get (json_obj fields &optional n)
(let ((place (assoc fields json_obj :test 'string=)))
(if (null place)
n
(ns (second place) t)))

函数的行为应该与序言谓词相同。例如,如果输入是:

CL-prompt> (defparameter x (json-parse "{\"nome\" : \"Arthur\",\"cognome\" : \"Dent\"}"))
X

CL-prompt> x
(json-obj ("nome" "Arthur") ("cognome" "Dent"))

输出应该是:

CL-prompt> (json-get x "cognome")
"Dent"

insted,如果输入是:

(json-get (json-parse 
"{\"name\" : \"Zaphod\",
\"heads\" : [[\"Head1\"], [\"Head2\"]]}")
"heads" 1 0)

输出应该是:

"Head2"

我写的函数完全错了吗?

附言对于这个项目,函数中禁止使用像 SET、SETQ、SETF e MULTIPLE-VALUE-SETQ 和 DO、DO*、DOTIMES、DOLIST e LOOP 和 DEFPARAMETER、DEFVAR e DEFCOSTANT 等函数

谢谢大家

编辑 1:

这是这个函数的描述,

    a json-get function that accepts a JSON object
(represented in Common Lisp, as produced by the json_parse function) and a series of
"Fields", retrieve the corresponding object. A field represented by N (with N a number
greater than or equal to 0) represents an index of a JSON array.

编辑 2:如果我尝试运行 json-get lisp 回答我:

错误:变量 PLACE 未绑定(bind)。

最佳答案

你需要递归地实现它。您还需要区分 JSON 数组(作为前缀为 json-array 的元素列表实现)和 JSON 对象(作为关联列表实现)。

(defun json-get (json_obj fields)
(if (null fields) ; base case of recursion
json_obj
(let* ((cur-key (car fields))
(current (cond ((and (integerp cur-key)
(eq (car json_obj) 'json-array))
(nth (1+ cur-key) json_obj)) ; add 1 to skip over JSON-ARRAY
((and (stringp cur-key)
(eq (car json_obj) 'json-obj))
(second (assoc cur-key (cdr json_obj) :test #'string=))) ; Use CDR to skip over JSON-OBJ
(t (error "~S is not a JSON object or array or ~s is not appropriate key" json_obj cur-key)))))
(json-get current (cdr fields)))))

fields 必须是一个字段列表,所以你的第二个例子是:

(json-get (json-parse 
"{\"name\" : \"Zaphod\",
\"heads\" : [[\"Head1\"], [\"Head2\"]]}")
'("heads" 1 0))

第一个例子应该是:

(json-get x '("cognome"))

关于lisp 中的 json-get 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48211987/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com