Как сравнить два json объекта только по ключу? - PullRequest
0 голосов
/ 16 января 2020

У меня есть два json объекта, и я сравниваю их, Но это сравнивается по ключу и значению, И я хочу сравнить два json объекта только по ключу, Как мне это сделать?

Это мой код:

var jdp = new JsonDiffPatch();
var areEqual2 = jdp.Diff(json1, json2);

Ответы [ 3 ]

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

вы можете создать и использовать такой класс:

class CustomComparer : IEqualityComparer<YourObjectType> 
{  

    public bool Equals(YourObjectType first, YourObjectType second) 
    {  
        if (first == null | second == null) { return false; } 

        else if (first.Hash == second.Hash) 
            return true; 

        else return false;
    }

    public int GetHashCode(YourObjectType obj)
    {
        throw new NotImplementedException();
    }        
}
0 голосов
/ 16 января 2020

Если вы хотите получить разницу между 2 json:

       private List<string> GetDiff(List<string> path1, List<string> path2)
    {
        List<string> equal=new List<string>();

        foreach (var j1 in path1)
        {
            foreach (var j2 in path2)
            {
                if (j1 == j2)
                {
                    equal.Add(j1);
                }
            }   
        }        
        return equal;
    }
0 голосов
/ 16 января 2020

Один из способов добиться этого - получить имена / пути всех ключей в json и сравнить список. Например,

var path1 = GetAllPaths(json1).OrderBy(x=>x).ToList();
var path2 = GetAllPaths(json2).OrderBy(x=>x).ToList();
var result = path1.SequenceEqual(path2);

Где GetAllPaths определяется как

private IEnumerable<string> GetAllPaths(string json)
{
    var regex = new Regex(@"\[\d*\].",RegexOptions.Compiled);
    return JObject.Parse(json).DescendantsAndSelf()
                   .OfType<JProperty>()
                   .Where(jp => jp.Value is JValue)
                   .Select(jp => regex.Replace(jp.Path,".")).Distinct();
}

Пример демонстрации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...