我正在测试返回JSON的API。返回的值具有子对象(例如,日期对象具有from和to属性)。我有一个示例JSON字符串,该字符串由API返回。比较仅按键而不按值比较两者的最佳方法是什么,以便仅比较JSON的结构(在这种情况下,如果有任何限制,请使用C#)?我看到有人问过类似的问题,但不是我要找的东西。
当前问题中的JSON看起来像这样:
{
"collection":[{
"timePeriod":{
"from": "2017-01-01",
"to": "2017-02-01"
},
"type": "a",
"amount": 463872,
"outstanding": 463872,
"due": "2017-03-08"
}]
}
答案 0 :(得分:1)
一种解决方案是将Json.NET和Json.NET Schema nuget包用于validate your JSON string against a JSON schema。
您可以创建JSON模式或基于C#对象生成一个模式。在这种情况下,我生成了一些与您的JSON结构匹配的类(对类名表示抱歉):
public class RootObject
{
[JsonProperty("collection", Required = Required.Always)]
public List<Item> Collection { get; set; }
public RootObject()
{
Collection = new List<Item>();
}
}
public class Item
{
[JsonProperty("timePeriod", Required = Required.Always)]
public TimePeriod TimePeriod { get; set; }
[JsonProperty("type", Required = Required.Always)]
public string Type { get; set; }
[JsonProperty("amount", Required = Required.Always)]
public int Amount { get; set; }
[JsonProperty("outstanding", Required = Required.Always)]
public int Outstanding { get; set; }
[DataType(DataType.Date)]
[JsonProperty("due", Required = Required.Always)]
public DateTime Due { get; set; }
}
public class TimePeriod
{
[DataType(DataType.Date)]
[JsonProperty("from", Required = Required.Always)]
public DateTime From { get; set; }
[DataType(DataType.Date)]
[JsonProperty("to", Required = Required.Always)]
public DateTime To { get; set; }
}
我假设所有属性都是必需的。另外,关于DateTime属性,我正在使用“数据注释”来指定日期不包含时间部分(而不是完整的ISO日期)。
验证架构:
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);
}