Python从变量读取JSON数据及解析jboss-cli.sh输出问询
嘿,我来帮你搞定这两个Python相关的问题!
问题1:在Python中从变量读取JSON数据
Python自带的json模块就能轻松搞定这个需求。如果你的JSON数据是字符串变量,直接用json.loads()方法解析成Python字典/列表就行——和从文件读取用的json.load()是一对儿,区别就是前者处理字符串,后者处理文件对象。
举个简单的例子:
import json # 假设这是你存储JSON数据的字符串变量 json_data_str = '{"username": "john_doe", "is_active": true, "roles": ["admin", "user"]}' # 把字符串解析成Python字典 parsed_data = json.loads(json_data_str) # 现在就能像操作普通字典一样访问数据啦 print(parsed_data["username"]) # 输出 john_doe print(parsed_data["roles"][0]) # 输出 admin
如果你的变量是字节类型(比如从网络请求返回的),先转成字符串再解析就行:json.loads(byte_data.decode("utf-8"))。
问题2:解析jboss-cli.sh的特殊输出格式
jboss-cli.sh默认返回的这个格式看着像JSON,但其实是它自己的“类JSON”格式(用=>代替了标准JSON的:),而且你的例子里输出还被截断了(末尾的s...),所以得先做两步预处理,再解析:
步骤1:把非标准格式转成标准JSON
首先把所有的=>替换成:,然后处理截断的部分,保证JSON结构完整。
步骤2:解析并提取数据
用json.loads()解析处理后的字符串,然后就可以提取你需要的字段了。
完整代码示例:
import json # 假设这是你从jboss-cli.sh获取到的输出内容 jboss_output = '{ "outcome" => "success", "result" => { "ActiveCount" => "0", "AvailableCount" => "0", "AverageBlockingTime" => "0", "AverageCreationTime" => "0", "CreatedCount" => "0", "DestroyedCount" => "0", "InUseCount" => "0", "MaxCreationTime" => "0", "MaxUsedCount" => "0", "MaxWaitCount" => "0", "MaxWaitTime" => "0", "TimedOut" => "0", "TotalBlockingTime" => "0", "TotalCreationTime" => "0", "s...' # 第一步:替换非标准的=>为标准JSON的: standard_json_str = jboss_output.replace('=>', ':') # 第二步:修复截断的JSON结构(根据实际输出调整,这里假设末尾缺两个闭合大括号) if standard_json_str.endswith('s...'): # 去掉末尾的省略号,补全闭合大括号 standard_json_str = standard_json_str[:-3] + '}}' # 尝试解析JSON try: parsed_data = json.loads(standard_json_str) # 提取result对象里的字段 result = parsed_data.get('result', {}) # 按需获取你需要的字段 active_count = result.get('ActiveCount') available_count = result.get('AvailableCount') print(f"ActiveCount: {active_count}, AvailableCount: {available_count}") except json.JSONDecodeError as e: print(f"解析出错啦:{e},大概率是输出截断太严重,建议先确保拿到完整的jboss-cli输出")
更省心的小技巧:让jboss-cli直接输出标准JSON
其实不用这么麻烦,jboss-cli本身支持输出标准JSON格式!你只需要在执行命令的时候加上--output=json参数就行,比如:
./jboss-cli.sh --connect --command="/subsystem=datasources/data-source=YourDataSource:read-resource(include-runtime=true)" --output=json
这样返回的就是标准JSON字符串,直接用json.loads()解析就行,完全不用手动处理格式转换,靠谱多了!
内容的提问来源于stack exchange,提问作者Manii
相关产品推荐
相关产品推荐

