如何让jq将类JSON中的None、True识别为字符串?
让jq将近似JSON中的None/True视为字符串的方法
你的工具输出的是类Python字典格式的内容,而非标准JSON:
{"acquired": None, "avail": True, "cls": "NetworkService", "params": {"address": "192.168.7.193", "password": "root", "username": "root"}}
以下是两种无需逐个替换关键词的解决方案:
方法一:用Python预处理(最稳妥)
利用Python的ast.literal_eval可以直接解析这种类字典格式,再将指定字面量转为字符串后输出标准JSON,让jq正常处理:
python3 -c ' import ast, json def convert_literals(obj): if isinstance(obj, dict): return {k: convert_literals(v) for k, v in obj.items()} elif isinstance(obj, list): return [convert_literals(i) for i in obj] elif obj is None or isinstance(obj, bool): return str(obj) return obj data = ast.literal_eval(input()) print(json.dumps(convert_literals(data))) ' < 你的输入文件 | jq .
这个方法能自动处理所有Python风格的字面量(比如False),不管嵌套层级多深,都能把None、True、False转为对应的字符串,完全不用担心遗漏新的关键词。
方法二:纯jq文本处理(无需额外依赖)
如果环境里没有Python,可以用jq的字符串替换能力,精准匹配独立的关键词并转为字符串,再解析为JSON:
jq -R 'gsub("\b(None|True|False)\b"; "\"\1\"")' < 你的输入文件 | jq .
这里的\b是单词边界,只会替换独立的None/True/False,不会误改包含这些词的普通字符串(比如"TrueHost"不会被处理)。如果之后出现新的类似关键词,只要在正则括号里添加即可,比如(None|True|False|null)。
内容的提问来源于stack exchange,提问作者Kjeld Flarup
相关产品推荐
相关产品推荐

