Linux环境下非标准JSON格式键值对提取方案咨询
最优解决方案:用Python的
ast.literal_eval()解析非标准类JSON数据 嘿,这个问题我太懂了!遇到这种用单引号包裹、结构是JSON样但没法用jq等标准JSON工具解析,而且键顺序还乱跳的数据,正则和cut确实搞不定——尤其是还有嵌套字典的情况,正则写起来会疯掉。咱直接用你已经在调用的Python来解决,这才是最省心的办法!
核心思路:用ast.literal_eval()安全解析类JSON
Python的ast模块里的literal_eval()函数专门用来解析这种“类Python字面量”的字符串,它能处理单引号的键值对、嵌套结构,而且比直接用eval()安全一万倍(不会执行恶意代码)。完美适配你遇到的场景。
完整脚本示例(getprice.py)
把下面的代码存成getprice.py,就能轻松提取任何你想要的键值对,完全不管键的顺序:
import ast import sys def extract_price_data(): # 从命令行获取传入的类JSON字符串 if len(sys.argv) < 2: print("请传入要解析的类JSON数据参数") return raw_input = sys.argv[1] try: # 把类JSON字符串转成Python字典 data_dict = ast.literal_eval(raw_input) # 提取顶层字段,用get()避免键不存在报错 print(f"🔹 Last价格: {data_dict.get('last', '未找到')}") print(f"🔹 Bid价格: {data_dict.get('bid', '未找到')}") print(f"🔹 Ask价格: {data_dict.get('ask', '未找到')}") # 处理嵌套的volume字段 volume_data = data_dict.get('volume', {}) print("\n📊 成交量数据:") print(f" USD成交量: {volume_data.get('USD', '未找到')}") print(f" TLC成交量: {volume_data.get('TLC', '未找到')}") print(f" 时间戳: {volume_data.get('timestamp', '未找到')}") except SyntaxError as e: print(f"❌ 解析失败:输入数据格式有问题 - {e}") except Exception as e: print(f"❌ 发生未知错误:{e}") if __name__ == "__main__": extract_price_data()
怎么用?
直接像你原来那样调用就行,不管键的顺序怎么变,输出都稳定:
root# python3 getprice.py {'bid': '11546.94', 'ask': '11551.96', 'volume': {'USD': '51726566.064352112368', 'TLC': '4388.676466043', 'timestamp': 1561785300000}, 'last': '11551.96'}
输出会是整理好的结构化内容,完全不用操心键的顺序。
快速提取单个字段(单行命令)
如果只是临时想提取某个字段,比如last,可以直接用单行Python命令,不用写脚本:
root# python3 -c "import ast, sys; print(ast.literal_eval(sys.argv[1])['last'])" {'last': '11551.96', 'bid': '11546.94', 'ask': '11551.96'}
为什么这是最优解?
- 无视键顺序:字典按键访问,完全不依赖字段的排列顺序
- 支持嵌套结构:正则很难处理多层嵌套的字典,但
ast.literal_eval()能完美解析 - 安全可靠:比
eval()安全,不会执行传入的恶意代码 - 零额外依赖:用Python内置模块,不用装任何第三方包
内容的提问来源于stack exchange,提问作者SwimJim
相关产品推荐
相关产品推荐

