如何在C#中测试一个JSON是否包含另一个JSON?
验证JSON包含性(Json2包含Json1)的测试方法(无需自行实现逻辑)
先明确测试需求:确认Json2包含Json1的所有字段(包括嵌套字段)且对应值完全一致,忽略Json2的额外字段,以此验证版本无变更。
示例JSON
Json1:
{ "a": 1, "b": { "b1": 21 } }
Json2:
{ "a": 1, "b": { "b1": 21, "b2": 22 }, "c": 3 }
具体实现方法
1. 用JSON Schema校验
把Json1转换成精确匹配值的JSON Schema,再用Schema校验Json2。只要Json2满足Schema定义的所有字段要求(值完全匹配、必填字段存在),就说明Json2包含Json1。
以Python的jsonschema库为例:
from jsonschema import validate json1 = {"a": 1, "b": {"b1": 21}} json2 = {"a": 1, "b": {"b1": 21, "b2": 22}, "c": 3} # 构造匹配Json1的Schema,用const指定精确值 match_schema = { "type": "object", "properties": { "a": {"const": json1["a"]}, "b": { "type": "object", "properties": { "b1": {"const": json1["b"]["b1"]} }, "required": ["b1"] } }, "required": ["a", "b"] } # 校验,无报错则说明Json2符合要求 validate(instance=json2, schema=match_schema)
2. 用语言专属的JSON对比库
很多成熟的工具库直接支持"子集匹配",不用自己写递归逻辑:
- JavaScript/TypeScript:用
lodash的isMatch方法,直接检查Json2是否包含Json1的所有属性和值:const _ = require('lodash'); const json1 = {"a": 1, "b": {"b1": 21}}; const json2 = {"a": 1, "b": {"b1": 21, "b2": 22}, "c": 3}; console.log(_.isMatch(json2, json1)); // 输出 true - Java:用
JSONAssert库,开启LENIENT模式,允许Json2有额外字段:import org.skyscreamer.jsonassert.JSONAssert; import org.skyscreamer.jsonassert.JSONCompareMode; public class JsonInclusionTest { public static void main(String[] args) throws Exception { String json1 = "{\"a\":1,\"b\":{\"b1\":21}}"; String json2 = "{\"a\":1,\"b\":{\"b1\":21,\"b2\":22},\"c\":3}"; // 无异常抛出则验证通过 JSONAssert.assertEquals(json1, json2, JSONCompareMode.LENIENT); } } - Python:用
deepdiff库,检查Json1的所有字段在Json2中值完全匹配,忽略新增字段:from deepdiff import DeepDiff json1 = {"a": 1, "b": {"b1": 21}} json2 = {"a": 1, "b": {"b1": 21, "b2": 22}, "c": 3} # 只检查Json1有的字段,忽略Json2新增的内容 diff = DeepDiff(json1, json2, ignore_order=True, exclude_paths=["root.c", "root.b.b2"]) if not diff: print("Json2包含Json1的所有字段且值匹配")
3. 命令行工具(jq)
用jq编写表达式直接验证,适合快速测试:
# 假设json1.json和json2.json是保存两个JSON的文件 jq -n --argfile a json1.json --argfile b json2.json '$b | .a == $a.a and .b.b1 == $a.b.b1'
运行后输出true则说明符合要求。如果是复杂嵌套结构,可以写递归的jq表达式来批量检查所有字段。
内容的提问来源于stack exchange,提问作者orirab
相关产品推荐
相关产品推荐

