【问题标题】:How to modify a nested plist when keys are strings当键是字符串时如何修改嵌套的plist
【发布时间】: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


【解决方案1】:
CL-USER 346 > (pprint
               (subst "grandchild-1b-value-modified"
                      "grandchild-1b-value"
                      '("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")))
                      :test #'equal))

("person"
 ("child-1"
  ("grandchild-1a"
   "grandchild-1a-value"
   "grandchild-1b"
   "grandchild-1b-value-modified")
  "child-2"
  ("grandchild-2a"
   "grandchild-2a-value"
   "grandchild-2b"
   "grandchild-2b-value")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2019-08-29
    相关资源
    最近更新 更多