Common Lisp自定义JSON生成函数不符合预期及编译警告求助
问题解决:Common Lisp JSON生成错误与编译警告修复
一、编译警告修复
警告原因
INPUT-MSG is bound but not referenced警告源于json-encode函数外层let中定义了input-msg变量,但该变量从未被使用——内层let中的input-msg是重新绑定的新变量,与外层无关。
修复方法
直接删除json-encode外层let中的(input-msg nil)行即可消除警告。
二、JSON格式错误修复
错误原因
- 字符串值缺少双引号:原始代码用
~a格式化值,Lisp字符串通过~a输出时不带双引号,不符合JSON字符串必须用双引号包裹的语法要求。 - 数字未转为字符串:若期望数字以JSON字符串形式存在(如
"30"而非30),需手动将Lisp数字转为字符串后添加引号。 - nil的JSON映射错误:Lisp的
nil应对应JSON的null,直接输出会得到大写的NIL,不符合JSON规范。
修复后的代码示例
修复第一个示例(达到期望输出)
(defun create-json-object (key value) ;; 根据值的类型格式化,符合JSON规范 (let ((formatted-value (typecase value (string (format nil "\"~a\"" value)) (number (format nil "\"~a\"" value)) ; 数字转为字符串类型 (t (format nil "~a" value))))) (format nil "\"~a\": ~a" key formatted-value))) (defun example-json-encode () (let ((name "Bull") (age 30) (city "Nowhere")) (let ((json-object (list (create-json-object "name" name) (create-json-object "age" age) (create-json-object "city" city)))) (format t "{~{~a~^,~}}" json-object)))) (example-json-encode) ; 直接调用输出,无需额外print
执行后输出:
{"name": "Bull","age": "30","city": "Nowhere"}
修复第二个修改后的代码
(defun create-json-object (key value) (let ((formatted-value (typecase value (string (format nil "\"~a\"" value)) (number (format nil "\"~a\"" value)) (null "null") ; 将Lisp nil转为JSON null (t (format nil "~a" value))))) (format nil "\"~a\": ~a" key formatted-value))) (defun json-encode () (let ((requestID "DUMMYREQUEST") (sId "OL") (city "RANCHI") (houseNumber 12345) (streetName "MG ROAD") (state "JH") (QType "HIGH") (POBOX nil) (Network "OWN") (MessageSrcSystem "XXXX")) (let ((input-msg (create-json-record requestID sId city houseNumber streetName state QType POBOX Network MessageSrcSystem))) (format t "~a" input-msg)))) (defun create-json-record (requestID sId city houseNumber streetName state QType POBOX Network MessageSrcSystem) (let ((json-object (list (create-json-object "requestId" requestID) (create-json-object "sId" sId) (create-json-object "houseNumber" houseNumber) (create-json-object "streetName" streetName) (create-json-object "city" city) (create-json-object "state" state) (create-json-object "quality" QType) (create-json-object "postoffice" POBOX) (create-json-object "network" Network) (create-json-object "messageSrcSystem" MessageSrcSystem)))) (format nil "{~{~a~^,~}}" json-object)))
执行后会生成符合规范的JSON,同时编译时无警告。
内容的提问来源于stack exchange,提问作者raymond indwar
相关产品推荐
相关产品推荐

