Лучший способ проверки, если данный ключ JSON и значение в одном файле доступны в другом файле - PullRequest
1 голос
/ 22 января 2020

Мне трудно реализовать лог c, который будет проверять, имеет ли определенное значение ключа (вместе) в одном файле фактическое точно такое же значение ключа в другом файле

у меня есть один файл, как показано ниже,

[
{
"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" нет, поэтому я хочу напечатать в Консоль неудачного сообщения

Может кто-нибудь помочь мне в этом, пожалуйста? Есть идеи, какой алгоритм мне нужен?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Сначала вы можете создать два класса моделей, представляющих ваш 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; }
}

Затем десериализовать JSON с этими классами, используя Newtonsoft Json. NET. Поскольку мы имеем дело с 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);

Затем вы можете просто сравнить, используя Any() из LINQ:

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

Другая реализация можно десериализовать в кортежи, а затем просто преобразовать twos в 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}");
    }
}
0 голосов
/ 22 января 2020

Используйте Newtonsoft и используйте класс POCO для анализа ваших двух моделей и сравнения после этого свойств обоих экземпляров.

См. Этот пример того, как десериализовать json

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

Вы можете использовать отражение для итерации для всех свойств второго объекта, запрашивая значение свойства для сравнения. Это полезно, когда вы не знаете название свойства для сравнения.

Надеюсь, это поможет

...