如何在Racket中安全美观格式化JSON?无需依赖jq
无需依赖jq的Racket JSON格式化方案
你的原代码依赖外部工具jq,不仅需要系统提前安装该工具,还存在shell注入风险(比如JSON字符串包含特殊shell字符时,可能触发错误或危险操作),同时字符串转义逻辑也不够严谨。
Racket标准库自带json模块,完全可以实现无依赖的JSON格式化,以下是更安全、简洁的优化方案:
#lang racket (require json) (define (pretty-print-json json-str) (with-handlers ([exn:fail? (λ (e) (eprintf "无效JSON: ~a\n" (exn-message e)))]) ; 将JSON字符串解析为Racket原生数据结构 (define json-data (read-json (open-input-string json-str))) ; 带缩进输出JSON,设置缩进为2个空格 (write-json json-data (current-output-port) #:indentation 2) (newline)))
方案优势:
- 无外部依赖:仅使用Racket标准库,无需系统安装
jq - 安全可靠:避开shell注入风险,直接操作JSON数据结构而非字符串拼接
- 严谨的错误处理:自带JSON合法性校验,解析失败时会给出明确错误提示
- 格式可自定义:通过
#:indentation参数可自由调整缩进空格数,还能通过其他参数控制换行、空格等细节
示例使用:
(pretty-print-json "{\"name\":\"Alice\",\"age\":30,\"hobbies\":[\"reading\",\"coding\"]}")
输出结果:
{ "name": "Alice", "age": 30, "hobbies": [ "reading", "coding" ] }
内容的提问来源于stack exchange,提问作者MohamedLEGH
相关产品推荐
相关产品推荐

