如何在JSON文件中精确匹配目标字符串(避免子串误匹配)
解决JSON中精确匹配单词的问题
你的问题核心在于直接对JSON字符串使用Contains或IndexOf会匹配子串,而非精确匹配整个键或值——就像你遇到的情况,"byroots"里的"root"会被误判为匹配,但你需要的是完全等于目标单词的结果。
正确的思路是先把JSON解析成结构化对象,再遍历检查每个键和值是否精确匹配目标词。下面是具体的实现方案:
实现步骤
- 先安装Json.NET(Newtonsoft.Json)库:这是C#处理JSON最常用的工具,直接通过NuGet搜索
Newtonsoft.Json安装即可。 - 将JSON字符串解析为
JObject,遍历所有属性,分别检查键和值是否与目标单词精确相等(支持区分/不区分大小写)。
示例代码
using Newtonsoft.Json.Linq; using System.IO; using System.Linq; // 你要搜索的目标单词 string targetWord = "root"; bool exactMatchFound = false; using (StreamReader r = new StreamReader("filename.json")) { string jsonContent = r.ReadToEnd(); // 解析JSON为结构化对象 JObject jsonObj = JObject.Parse(jsonContent); // 遍历所有JSON属性(包括嵌套层级的属性) foreach (var property in jsonObj.Descendants().OfType<JProperty>()) { // 检查属性键是否精确匹配(不区分大小写,需要区分的话换成StringComparison.Ordinal) if (property.Name.Equals(targetWord, StringComparison.OrdinalIgnoreCase)) { exactMatchFound = true; break; } // 检查属性值是否为字符串类型且精确匹配 if (property.Value.Type == JTokenType.String && property.Value.ToString().Equals(targetWord, StringComparison.OrdinalIgnoreCase)) { exactMatchFound = true; break; } } } // 根据匹配结果执行后续逻辑 if (exactMatchFound) { filename = path + branch + "-" + testsuite.Title + ".json"; }
为什么之前的方法无效?
直接操作JSON字符串时,Contains和IndexOf是在整个字符串中查找子串,只要目标词出现在任何位置(比如"byroots"里的"root")都会返回true,完全不符合你需要的精确匹配整个元素的要求。而解析成结构化对象后,我们可以逐个检查每个键和值的完整内容,确保只有完全相等的情况才会被判定为匹配。
如果只需要检查键或者只检查值,可以去掉对应的判断逻辑,比如只关心值的话,就删除检查属性键的代码块。
内容的提问来源于stack exchange,提问作者Abhishek K Suresh
相关产品推荐
相关产品推荐

