比较JSON结构

时间:2018-09-18 15:09:00

标签: c# json

我正在测试返回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"
   }]
}

1 个答案:

答案 0 :(得分:1)

一种解决方案是将Json.NETJson.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);
}