验证一个文件中的给定 JSON 键和值在另一个文件中是否可用的最佳方法



我发现很难实现一个逻辑来检查一个文件中的某个键值(一起(在另一个文件中是否具有实际完全相同的键值

我有一个文件如下,

[
{
"IdInOne": "001",
"NameInOne": "Name_2"
},
{
"IdInOne": "002",
"NameInOne": "Name_3"
}
]

另一个作为

[
{
"IdInTwo": "001",
"NameInTwo": "Name_1"
},
{
"IdInTwo": "001",
"NameInTwo": "Name_2"
},
{
"IdInTwo": "001",
"NameInTwo": "Name_3"
},
{
"IdInTwo": "002",
"NameInTwo": "Name_4"
}
]

在此示例中,有一个条目,其中"IdInOne": "001","NameInOne": "Name_2" 与第二个 JSON 文件中完全相同的值匹配。所以在这种情况下,我将打印一条成功消息

但是在第二个 JSON 文件中没有匹配项,其中"IdInOne":"002","NameInOne":"Name_3"因此我想在控制台中打印一条不成功的消息

谁能帮我这个?知道我需要什么样的算法吗?

您可以先创建两个表示 JSON 的模型类:

public class One
{
public string IdInOne { get; set; }
public string NameInOne { get; set; }
}
public class Two
{
public string IdInTwo { get; set; }
public string NameInTwo { get; set; }
}

然后使用 Newtonsoft Json.NET 对这些类反序列化 JSON。由于我们正在处理 JSON 数组,因此我们可以反序列化为List<T>.

var json1 = "[{"IdInOne": "001","NameInOne": "Name_2"},{"IdInOne": "002","NameInOne": "Name_3"}]";
var json2 = "[{"IdInTwo": "001","NameInTwo": "Name_1"},{"IdInTwo": "001","NameInTwo": "Name_2"},{"IdInTwo": "001","NameInTwo": "Name_3"},{"IdInTwo": "002","NameInTwo": "Name_4"}]";
var deserializedJson1 = JsonConvert.DeserializeObject<List<One>>(json1);
var deserializedJson2 = JsonConvert.DeserializeObject<List<Two>>(json2);

然后,您可以使用 LINQ 中的Any()简单地进行比较:

foreach (var one in deserializedJson1)
{
if (deserializedJson2.Any(two => two.IdInTwo == one.IdInOne &&
two.NameInTwo == one.NameInOne))
{
Console.WriteLine($"Match found with {one.IdInOne} and {one.NameInOne}");
} else
{
Console.WriteLine($"No match found with {one.IdInOne} and {one.NameInOne}");
}
}

哪些输出:

Match found with 001 and Name_2
No match found with 002 and Name_3

另一种实现可能是反序列化为元组,然后简单地将二进制转换为HashSet<T>并将其用于查找。拥有哈希集可以改进从 O(N( 到 O(1( 的查找,并且可以为更大的数据集提供性能提升。HashSet<T>.Contains(T)是一个 O(1( 方法。

var ones = JsonConvert
.DeserializeObject<List<One>>(json1)
.Select(x => (x.IdInOne, x.NameInOne));
var lookups = JsonConvert
.DeserializeObject<List<Two>>(json2)
.Select(x => (x.IdInTwo, x.NameInTwo))
.ToHashSet();
foreach (var (IdInOne, NameInOne) in ones)
{
if (lookups.Contains((IdInOne, NameInOne)))
{
Console.WriteLine($"Match found with {IdInOne} and {NameInOne}");
} else
{
Console.WriteLine($"No match found with {IdInOne} and {NameInOne}");
}
}

使用 Newtonsoft 并使用 POCO 类来解析两个模型,然后比较两个实例属性。

请参阅此示例,了解如何反序列化 json

https://www.newtonsoft.com/json/help/html/DeserializeObject.htm

可以使用反射循环访问第二个对象上的所有属性,以请求要比较的属性的值。 当您不知道要与之比较的属性的名称时,这很有用。

希望这有帮助

相关内容

最新更新