我的代码使用cl库将一行{"main" : "build/electron.js"}
添加到package.json文件中:
(let ((package-json-pathname (merge-pathnames *app-pathname* "package.json")))
(let
((new-json (with-open-file (package-json package-json-pathname :direction :input :if-does-not-exist :error)
(let ((decoded-package (json:decode-json package-json)))
(let ((main-entry (assoc :main decoded-package)))
(if (null main-entry)
(push '(:main . "build/electron.js") decoded-package)
(setf (cdr main-entry) "build/electron.js"))
decoded-package)))))
(with-open-file (package-json package-json-pathname :direction :output :if-exists :supersede)
(json:encode-json new-json package-json))
)
)
代码工作正常,但是结果有一个转义斜杠:
"main":"build\/electron.js"
我确信这是一件很简单的事情,但无论我尝试哪种输入-- "//“、”//“、"#//”--我仍然会得到转义斜杠。
如何才能在输出中得到一个正常的斜线?
此外,我也不确定是否有一种简单的方法可以获得打印良好的输出,或者是否需要编写这样的函数;现在,输出将整个package.json文件打印成一行。
发布于 2020-02-07 09:40:22
特殊字符
JSON Spec表示“任何字符都可以转义”,但其中一些字符必须转义:“引号、反向solidus和控制字符”。链接部分后面跟着在转义字符列表中显示"solidus“(/
)的语法。我不认为它在实践中真的很重要(通常不需要转义),但这可能解释了为什么库会转义这个角色。
如何避免逃跑
cl依赖于名为+json-lisp-escaped-chars+
的转义字符的内部列表,即:
(defparameter +json-lisp-escaped-chars+
'((#\" . #\")
(#\\ . #\\)
(#\/ . #\/)
(#\b . #\Backspace)
(#\f . #\)
(#\n . #\Newline)
(#\r . #\Return)
(#\t . #\Tab)
(#\u . (4 . 16)))
"Mapping between JSON String escape sequences and Lisp chars.")
符号不是导出的,但是您仍然可以用::
从外部引用它。您可以动态地重新绑定需要使用不同转义字符列表的代码周围的参数;例如,您可以这样做:
(let ((cl-json::+json-lisp-escaped-chars+
(remove #\/ cl-json::+json-lisp-escaped-chars+ :key #'car)))
(cl-json:encode-json-plist '("x" "1/5")))
这些指纹:
{"x":"1/5"}
https://stackoverflow.com/questions/60103909
复制相似问题