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

问题描述 投票:1回答:2

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

我有一个如下文件,

[
{
"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”,因此我想在控制台中打印不成功的消息

有人可以帮我吗?对我需要什么样的算法有任何想法吗?

c# .net json logic implementation
2个回答
1
投票

您首先可以创建两个表示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()进行简单比较:

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}");
    }
}

另一种实现方式可能是反序列化为元组,然后将twos转换为Match found with 001 and Name_2 No match found with 002 and Name_3 并将其用于查找。拥有哈希集可以改善从O(N)到O(1)的查找,并可以提高较大数据集的性能。 HashSet<T>是O(1)方法。

HashSet<T>.Contains(T)

0
投票

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

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

HashSet<T>.Contains(T)

您可以使用反射对第二个对象上的所有属性进行迭代,以请求比较该属性的值。当您不知道要比较的属性名称时,此功能很有用。

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.