如何在Python 3中对比JSON文件与预期结果并提取指定值
解决JSON嵌套结构的字段提取与验证问题
嘿,这问题我熟!你的JSON结构是嵌套的列表+字典组合,所以得一层一层往下定位,完全不用搞全量字符串对比,直接精准提取目标字段验证就行,不管用unittest还是Robot Framework都有简单的办法~
一、Python + unittest 实现
你的解析结果里,Customer对应的是一个列表(哪怕只有一个元素),所以得先取列表的第一个元素,再从字典里拿Role字段。直接上代码例子:
import json import unittest class TestJsonValidation(unittest.TestCase): def test_check_role_value(self): # 读取并解析JSON文件 with open('test_json.json', 'r') as f: json_data = json.load(f) # 逐层定位:根字典 → Customer列表 → 第一个用户字典 → Role字段 actual_role = json_data['Customer'][0]['Role'] # 验证值是否符合预期 self.assertEqual(actual_role, 'Test', "Role字段值不符合预期") # 拓展:验证其他字段的例子 actual_id = json_data['Customer'][0]['Id'] self.assertEqual(actual_id, '110', "Id字段值不符合预期") # 验证列表类型的字段(比如Limit) actual_limit = json_data['Customer'][0]['Limit'][0] self.assertEqual(actual_limit, '100', "Limit字段值不符合预期")
核心逻辑就是:先处理列表(用索引[0]取第一个元素),再访问字典的键,这样就能精准拿到单个字段的值,然后用unittest的断言做验证就行。
二、Robot Framework 实现
Robot里可以用专门的JSONLibrary来简化操作,也可以用内置库实现,两种方案都给你:
方案1:用JSONLibrary(推荐)
先安装库:pip install robotframework-jsonlibrary,然后写用例:
*** Settings *** Library JSONLibrary Library OperatingSystem *** Test Cases *** Verify JSON Role Field # 读取JSON文件内容 ${json_content}= Get File test_json.json # 解析JSON为可操作对象 ${json_obj}= Parse Json ${json_content} # 用JSONPath定位Role字段:$.Customer[0].Role ${actual_role}= Get Value From Json ${json_obj} $.Customer[0].Role # 验证值是否匹配 Should Be Equal ${actual_role} Test msg=Role字段值不符合预期 # 验证其他字段示例 ${actual_id}= Get Value From Json ${json_obj} $.Customer[0].Id Should Be Equal ${actual_id} 110 ${actual_limit}= Get Value From Json ${json_obj} $.Customer[0].Limit[0] Should Be Equal ${actual_limit} 100
JSONPath的语法非常灵活,哪怕结构更复杂也能轻松定位,很适合测试场景。
方案2:只用内置库(无需额外安装)
如果不想加新库,用BuiltIn和Collections也能搞定:
*** Settings *** Library BuiltIn Library Collections Library OperatingSystem *** Test Cases *** Verify JSON Role Without Extra Library # 读取文件并解析为Python对象 ${json_content}= Get File test_json.json ${json_obj}= Evaluate json.loads('''${json_content}''') json # 提取Customer列表 ${customer_list}= Get From Dictionary ${json_obj} Customer # 取列表第一个元素(用户字典) ${customer_dict}= Get From List ${customer_list} 0 # 提取Role字段值 ${actual_role}= Get From Dictionary ${customer_dict} Role # 验证 Should Be Equal ${actual_role} Test
关键提醒
你之前提取失败的原因是忽略了Customer对应的值是列表类型,不能直接hd['Customer']['Role'],必须先通过索引[0]取出列表里的字典元素,再访问字段哦~
内容的提问来源于stack exchange,提问作者pyton17
相关产品推荐
相关产品推荐

