如何将表示 JSON 数据的字符串转换为 Common Lisp 中 curl 符号上的字符串?

How to convert a string representing JSON data to a string on the curl notation in Common Lisp?

我正在使用 Steel Bank Common Lisp (SBCL)、Emacs 和 Slime。

执行函数后,我有:

CL-USER> (my-function my-data)

"{\"key-1\": \"value-1\"}"

我想将字符串 "{\"key-1\": \"value-1\"}" 转换为 curl 上的 REST 请求符号,因此字符串为:key-1&value-1

举例说明应用程序,这将是 data on curl:

curl --request POST --data "userId=key-1&value-1" https://jsonplaceholder.typicode.com/posts

解决方法是:

(ql:quickload :yason)

(defun json-string-to-rest-request (json-string)
  (destructuring-bind (a b) (alexandria:hash-table-plist (yason:parse json-string))
    (format nil "~a&~a" a b)))

您可以通过以下方式申请:

(defparameter *json-string* "{\"key-1\": \"value-1\"}")
(defparameter *json-string-1* "{\"KeY-1\": \"value-1\"}")

(json-string-to-rest-request *json-string*)
;; => "key-1&value-1"
(json-string-to-rest-request *json-string-1*)
;; => "KeY-1&value-1"

在此之前,我试过:

(ql:quickload :cl-json)

(defun json-string-to-rest (json-string)
  (with-input-from-string (s json-string)
    (destructuring-bind ((a . b)) (cl-json:decode-json s)
      (format nil "~a&~a" (string-downcase a) b))))

(json-string-to-rest *json-string*)
;; => "key-1&value-1"

然而,缺点是 cl-json:decode-json 首先将 json 字符串转换为 ((:KEY-1 . "value-1")) - 因此在使用 json 键字符串时区分大小写会丢失15=].

yason reads-in 键作为字符串,因此在键字符串中保留 case-sensitivity。