检查两个JSON是否相等

7

我有两个JSON文件。它们的内容无论格式和元素顺序如何都应该相同。

例如,这两个JSON文件是等价的,因为它们的属性和数组都相同,只是它们的顺序和格式类型不同:

{
  "type" : "integer",
  "values": [
    {
      "value": 1
    },
    {
      "value": 2
    }
  ]
}

并且

{
  "values": [
    { "value": 1 }, { "value": 2 }
  ],
  "type" : "integer"
}

如果我将它们存储为两个不同的字符串并进行比较,显然比较结果会显示它们是不同的。相反,我想从语义角度检查它们是否相等,因为它们具有相同的属性,并且对应的数组也相同。在C#中,是否有一种方法可以检查这两个Json是否相等,如果我将它们存储为两个不同的字符串?

1
反序列化两者并比较结果。 - Emond
有没有一种方法可以在不提前知道JSON文件格式的情况下进行操作呢?因为它们的模式未预定义,我应该能够对包含在JSON文件中的任何类型数据进行操作。 - Jepessen
1
请查看此 Stack Overflow 答案:https://dev59.com/1WAf5IYBdhLWcg3wOQm2#31926367 - Luc Morin
1
如果您事先不知道JSON的结构,那么在这里要做到100%的准确性可能会有些困难。例如,"value": 1"value": 1.0是否相同? - DavidG
1
其中一种方法是将每个JSON转换为XML并使用MS XmlDiff库,这里是完整的答案https://dev59.com/ymIk5IYBdhLWcg3wBZ_7#21581440。 - Eugene Komisarenko
2个回答

10
使用 Newtonsoft.Json NuGet 包的 DeepEquals 方法:DeepEquals
using Newtonsoft.Json.Linq;

var jsonText1 = File.ReadAllText(fileName1);
var jsonText2 = File.ReadAllText(fileName2);

var json1 = JObject.Parse(jsonText1);
var json2 = JObject.Parse(jsonText2);

var areEqual = JToken.DeepEquals(json1, json2);

你不知道吗?在比较JArrays时,可以进行排序。 - tsul
@tsul - 这是一个不同的问题。请将其发布为一个适当的问题,而不是作为评论。 - Emond
1
请注意,当比较的对象以不同方式创建时,DeepEquals 可能会返回错误的负面结果。例如,包含类型为 Guid 的值的 JToken 被认为与另一个具有相同值但作为 String 加载的 JToken 不同。但是,在从字符串解析两个比较方面时,可以安全使用。 - Imre Pühvel

1

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