如何检查两个JSON对象是否相等?

11

我正在尝试查明两个JSON字符串是否相等。

这是我之前尝试过的方法:

var obj1 = Json.Decode("{\"ValueA\":1,\"ValueB\":2}")
var obj2 = Json.Decode("{\"ValueB\":2,\"ValueA\":1}")

// But then there seems to be no way to compare the two objects?

肯定存在一种优雅简单的方法来完成我认为是一个普遍任务的吧?


1
可能是JavaScript中的对象比较的重复问题(因为您此时并不实际比较JSON,而是JSO)。 - Brad Christie
@BradChristie,您提供的是纯JavaScript代码,我正在寻找C#解决方案。 - Ally
1
摸摸头。看来我还没完全清醒。在这种情况下,您可以使用常见的库进行反序列化,然后重新序列化并进行比较。否则,就必须实现深度对象复制。 - Brad Christie
1
@Ally:你已经在使用Json.Decode了。你可以将它们Encode回字符串(这样应该是统一的),然后进行比较,这样可以避免使用其他库。 - Brad Christie
1
@MarioStoilov 对于复杂对象来说,这种方法行不通,因为字典值只会是另一个复杂的JSON。 - rae1
显示剩余19条评论
3个回答

17

用另一种方法比较json - 使用JToken.DeepEquals比较JSON

JObject o1 = new JObject
 {
    { "Integer", 12345 },
    { "String", "A string" },
    { "Items", new JArray(1, 2) }
 };

JObject o2 = new JObject
 {
    { "Integer", 12345 },
    { "String", "A string" },
    { "Items", new JArray(1, 2) }
 };

Console.WriteLine(JToken.DeepEquals(o1, o2));

5
这是关于Json.NET的东西,对吗?如果是的话,请说明。 - RhinoDevel
1
这个完美运作。我只是使用了 JObject.Parse 将 JSON 字符串转换为 JObject。 - Babu James

1
你可以使用 Compare .NET Objects 库来检查两个对象实例是否相等。它知道如何比较列表、字典等,并深度比较整个对象图。它还支持详细报告不同之处,并且具有许多你未来可能想要使用的功能。

0

我能够使用以下代码在某种程度上比较两个JSON。对于基本类,我能够得到很好的结果。

我希望通过一些更多的帮助和调整,可以使下面的代码更加健壮。

    static void Main(string[] args)
    {
        var o = new
        {
            ValueA = "",//Comparison Works
            ValueB = "",//Comparison Works
            ValueC = new { ValueD = "", ValueE = "" },//Comparison Works
            ValueF = new[] { new { ValueG = "", ValueH = "" } },//Fails if the array values are out of order
            ValueI = new SortedDictionary<object, object>()//Comparison works
        };

        var t = JsonConvert.DeserializeAnonymousType(
            "{\"ValueA\":1,\"ValueB\":2, \"ValueC\":{\"ValueE\":2,\"ValueD\":1}, \"ValueF\":[{\"ValueG\":10,\"ValueH\":25}],\"ValueI\":{\"Test1\":\"Val1\",\"Test2\":\"Val1\"}}", o);

        var q = JsonConvert.DeserializeAnonymousType(
            "{\"ValueB\":2,\"ValueA\":1, \"ValueC\":{\"ValueD\":1,\"ValueE\":2}, \"ValueF\":[{\"ValueH\":25,\"ValueG\":10}],\"ValueI\":{\"Test2\":\"Val1\",\"Test1\":\"Val1\"}}", o);

        var prop = t.GetType().GetProperties();

        var match = true;

        foreach (var item in prop)
        {
            var type = item.PropertyType;

            if (type.IsArray)
            {
                var v1 = item.GetValue(t) as Array;
                var v2 = item.GetValue(q) as Array;
                if ((v1 != null && v2 != null))
                {
                    if ((v1.Length != v2.Length))
                    {
                        match = false;
                        break;
                    }
                    for (int i = 0; i < v1.Length; i++)
                    {
                        if (!v1.GetValue(i).Equals(v2.GetValue(i)))
                        {
                            match = false;
                            break;
                        }
                    }
                }
                else if ((v1 == null && v2 != null) || (v1 != null && v2 == null))
                {
                    match = false;
                    break;
                }
            }
            else if (type.Name.Contains("Dictionary"))
            {
                var v1 = (SortedDictionary<object, object>)item.GetValue(t);
                var v2 = item.GetValue(q) as SortedDictionary<object, object>;
                foreach (var ar in v1)
                {
                    if (!v2.Contains(ar))
                    {
                        match = false;
                        break;
                    }
                }
            }
            else if (!item.GetValue(t).Equals(item.GetValue(q)))
            {
                var v1 = item.GetValue(t);
                var v2 = item.GetValue(q);
                match = v1.ToString().Equals(v2.ToString());
                match = false;
                break;
            }
        }

        if (!match)
        {
            Console.WriteLine("Objects do not match");
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接