C# 比较JSON结构
我正在测试一个返回JSON的API。返回的值具有子对象(例如具有from和to属性的日期对象)。我有一个示例JSON字符串和API返回的字符串。通过仅键和不通过值来比较两者的最佳方法是什么,以便只比较JSON的结构(在本例中使用C#,以防有任何暴露)?我见过类似的问题被问到,但不完全是我想要的 目前问题中的JSON如下所示:C# 比较JSON结构,c#,json,C#,Json,我正在测试一个返回JSON的API。返回的值具有子对象(例如具有from和to属性的日期对象)。我有一个示例JSON字符串和API返回的字符串。通过仅键和不通过值来比较两者的最佳方法是什么,以便只比较JSON的结构(在本例中使用C#,以防有任何暴露)?我见过类似的问题被问到,但不完全是我想要的 目前问题中的JSON如下所示: { "collection":[{ "timePeriod":{ "from": "2017-01-01", "to"
{
"collection":[{
"timePeriod":{
"from": "2017-01-01",
"to": "2017-02-01"
},
"type": "a",
"amount": 463872,
"outstanding": 463872,
"due": "2017-03-08"
}]
}
一种解决方案是使用和nuget包 您可以创建JSON模式或基于C#对象生成JSON模式。在本例中,我生成了一些与您的JSON结构匹配的类(对于类名很抱歉): 您还可以获得架构错误,如下所示:
IList<string> messages;
bool isValidSchema = data.IsValid(schema, out messages);
foreach (string message in messages)
{
Console.WriteLine(message);
}
IList消息;
bool-isValidSchema=data.IsValid(schema,out消息);
foreach(消息中的字符串消息)
{
控制台写入线(消息);
}
您是否尝试过使用JToken.DeepEquals
@ArunKumar它将比较键和值,OP只是想比较键。您可以使用JObject
上的反射,解析这两个json字符串后将得到反射。比如jObject.Properties().ToList()代码>Check DeepEquals显示为比较值和键。我不想在这种情况下看到它,它工作得很好。谢谢你的帮助。
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Schema;
using Newtonsoft.Json.Schema.Generation;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string json = @"{
""collection"":[{
""timePeriod"":{
""from"": ""2017-01-01"",
""to"": ""2017-02-01""
},
""type"": ""a"",
""amount"": 463872,
""outstanding"": 463872,
""due"": ""2017-03-08""
}]
}";
var generator = new JSchemaGenerator();
JSchema schema = generator.Generate(typeof(RootObject));
JObject data = JObject.Parse(json);
bool isValidSchema = data.IsValid(schema);
}
}
}
IList<string> messages;
bool isValidSchema = data.IsValid(schema, out messages);
foreach (string message in messages)
{
Console.WriteLine(message);
}