【发布时间】:2021-06-13 17:34:31
【问题描述】:
("person"
("child-1"
("grandchild-1a" "grandchild-1a-value"
"grandchild-1b" "grandchild-1b-value")
"child-2"
("grandchild-2a" "grandchild-2a-value"
"grandchild-2b" "grandchild-2b-value")))
"grandchild-1b-value"如何修改为"grandchild-1b-value-modified"?键是字符串。
或者我怎样才能创建一个新的 var,它是一个等效的嵌套 plist,除了新值?
以下是我最终得到 plist 的方式。我将来自 drakma 请求的响应反馈给 yason:parse:
(let ((stream (drakma:http-request endpoint
:method :post
:want-stream t
:content-type "application/json"
:content request)))
(setf (flexi-streams:flexi-stream-external-format stream) :utf-8)
(let ((response (yason:parse stream :object-as :plist)))
***HERE***))
【问题讨论】:
-
字符串键使得使用 plist 函数变得困难,因为它们都使用
eql来比较键。您需要使用member ... :test #'string-equal来查找以密钥开头的 plist 的尾部。然后你可以用新值替换第二个元素。 -
yason:parse能否以另一种更易于处理的格式返回结果? -
@Barmar 我发现 st-json 有
getjso*支持获取路径,getjso可以与setf一起使用。 (因此,您必须保留setf的修改值的父项。)它还从 json 到 cl 往返准确地返回 json 的空数组、null 和 true/false。
标签: lisp common-lisp