You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式错误修复

错误原因

  1. 字符串值缺少双引号:原始代码用~a格式化值,Lisp字符串通过~a输出时不带双引号,不符合JSON字符串必须用双引号包裹的语法要求。
  2. 数字未转为字符串:若期望数字以JSON字符串形式存在(如"30"而非30),需手动将Lisp数字转为字符串后添加引号。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:43:25