首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过C#获取Json列差异

通过C#获取Json列差异
EN

Stack Overflow用户
提问于 2018-08-29 12:01:51
回答 4查看 291关注 0票数 0

我有两个结构相同的Json文件,我想比较两个文件之间的差异。我希望只获得列名。例如: Json 1:

代码语言:javascript
复制
{
  "Test": [
    {
      "Cust-no": "00000001",
      "Cust-status": "555",
      "Last-update": "1999-08-17"
    }
  ]
}

Json 2:

代码语言:javascript
复制
{
  "Test": [
    {
      "Cust-no": "00000001",
      "Cust-status": "666",
      "Last-update": "2018-08-17"
    }
  ]
}

预期结果:

代码语言:javascript
复制
[
  "Cust-status",
  "Last-update"
]
EN

回答 4

Stack Overflow用户

发布于 2018-08-29 14:16:58

你可以这样做:

代码语言:javascript
复制
class Program
    {
        static void Main(string[] args)
        {
            var json1 = "{  \"Test\": [ { \"Cust-no\": \"00000001\", \"Cust-status\": \"555\", \"Last-update\": \"1999-08-17\" } ]}";
            var json2 = "{  \"Test\": [ { \"Cust-no\": \"00000001\", \"Cust-status\": \"666\", \"Last-update\": \"2018-08-17\" } ]}";
            var list1 = JsonConvert.DeserializeObject<RootObject>(json1);
            var list2 = JsonConvert.DeserializeObject<RootObject>(json2);

        }
    }

    public class Test
    {
        [JsonProperty("Cust-no")]
        public string CustomerNumber { get; set; }

        [JsonProperty("Cust-status")]
        public string Status { get; set; }

        [JsonProperty("Last-update")]
        public string LastUpdated { get; set; }
    }

    public class RootObject
    {
        public List<Test> Test { get; set; }
    }

现在,您可以比较list1和list2对象以获得所需的输出。

希望这能有所帮助

票数 0
EN

Stack Overflow用户

发布于 2018-08-29 14:45:02

使用Newtonsoft库可以很容易地做到这一点。在C#中有一个类似于匿名对象的JObject。您可以将json字符串转换为JObject,然后可以循环您的JObject属性并检查它们是否相同。

当然,您可以创建C# poco类,并将您的json转换为下面提到的Praneet类,然后手动进行比较。

检查下面的小提琴。https://dotnetfiddle.net/VCBhCA

代码语言:javascript
复制
public static void Main()
{
    var json1 = @"{'Test':[{ "+
                    "'Cust-no':'00000001', "+
                    "'Cust-status':'555', "+
                    "'Last-update':'1999-08-17'} "+ 
                    "]}";

    var json2 = @"{'Test':[{ "+
                    "'Cust-no':'00000001', "+
                    "'Cust-status':'666', "+
                    "'Last-update':'2018-08-17'} "+ 
                    "]}";

    JObject obj1 = JsonConvert.DeserializeObject<JObject>(json1);
    JObject obj2 = JsonConvert.DeserializeObject<JObject>(json2);

    if (JToken.DeepEquals(obj1, obj2))
    {
        Console.WriteLine("Both Objects are same.");
        return;
    }


    // create another JObject thats points to your actual first element in 'Test' node from your json.
    JObject obj1Data = obj1.GetValue("Test")[0] as JObject;
    JObject obj2Data = obj2.GetValue("Test")[0] as JObject;

    var lst = new List<string>();               

    foreach (KeyValuePair<string, JToken> obj1Prop in obj1Data)
    {
      JProperty obj2Prop = obj2Data.Property(obj1Prop.Key);
      if (!JToken.DeepEquals(obj1Prop.Value, obj2Prop.Value))
      {
          lst.Add(obj1Prop.Key);
          Console.WriteLine(string.Format("{0} property value is changed", obj1Prop.Key));
      }
      else
      {
          Console.WriteLine(string.Format("{0} property value didn't change", obj1Prop.Key));
      }
    }
    Console.WriteLine("\n\nProperty Changed - ");
    lst.ForEach(p=>Console.WriteLine(p));       
}
票数 0
EN

Stack Overflow用户

发布于 2018-08-29 15:18:01

尝试这段与json的任何结构无关的代码:

代码语言:javascript
复制
class Program
{
    static JArray _ja = new JArray();
    static void Main(string[] args)
    {
        var json1 = "{  \"Test\": [ { \"Cust-no\": \"00000001\", \"Cust-status\": \"555\", \"Last-update\": \"1999-08-17\" } ]}";
        var json2 = "{  \"Test\": [ { \"Cust-no\": \"00000001\", \"Cust-status\": \"666\", \"Last-update\": \"2018-08-17\" } ]}";
        var jObject1 = JObject.Parse(json1);
        var jObject2 = JObject.Parse(json2);
        CompareJObjects(jObject1, jObject2);


        Console.WriteLine(_ja.ToString());
    }

    static void CompareJObjects(JObject o1, JObject o2)
    {
        foreach (var prop in o1.Properties())
        {
            switch (prop.Value)
            {
                case JValue jv:
                    {
                        CompareJValues((JValue)prop.Value, (JValue)o2[prop.Name], prop.Name);
                        break;
                    }
                case JArray ja:
                    {
                        int arrIndex = 0;
                        foreach (JObject content in ja.Children<JObject>())
                        {
                            CompareJObjects(content, ((JArray)o2[prop.Name]).Children<JObject>().ToList()[arrIndex]);
                            arrIndex++;
                        }
                        break;
                    }
                case JObject jo:
                    {
                        CompareJObjects(jo, (JObject)o2[prop.Name]);
                        break;
                    }
                default:
                    break;
            }
        }
    }

    static void CompareJValues(JValue jv1, JValue jv2, string propName)
    {
        var o1PropValue = jv1.Value;
        var o2PropValue = jv2.Value;
        if (!o1PropValue.Equals(o2PropValue))
        {
            _ja.Add(new JValue(propName));
        }
    }

}

它使用Newtonsoft.Json,这是.net最流行的json

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52069287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档