C# 比较Json集合,返回更改值

C# 比较Json集合,返回更改值,c#,json,C#,Json,我有不同字段的Json集合。所有字段都是动态的。请举下面的例子 [{"KB":"1","Id":"01","MemCode":1,"A":"2","B":"1","C":"2010-01-01T00:00:00","D":1} {"KB":"1","Id":"01","MemCode":2,"A":"2","B":"1","C":"2010-01-01T00:00:00","D":2}, {"KB":"1","Id":"01","MemCode":2,"A":"2","B":"1","C":"2

我有不同字段的Json集合。所有字段都是动态的。请举下面的例子

[{"KB":"1","Id":"01","MemCode":1,"A":"2","B":"1","C":"2010-01-01T00:00:00","D":1}
{"KB":"1","Id":"01","MemCode":2,"A":"2","B":"1","C":"2010-01-01T00:00:00","D":2},
{"KB":"1","Id":"01","MemCode":2,"A":"2","B":"1","C":"2010-01-01T00:00:00","D":3},
{"KB":"1","Id":"01","MemCode":2,"A":"2","B":"1","C":"2010-01-01T00:00:00","D":4}]
我想将四个数字的json与第一个进行比较,并确定变化, 就像在第四行中一样,Memcode是2,在第一行中Memcode是1。所以这里的memcode是从2变为1。 就像所有领域的智者一样。此字段可以是datetime/string等任何类型。这只是一个示例。JSON可能很长,包含许多字段。但所有json字符串都是相同的字段

所有字段都是动态的。我想要一些方法,做上述计算和返回字段的变化和旧的和新的价值观

我想使用C#和
Newtonsoft.Json
。我不知道如何达到上述目标。你能帮我/引导我吗

先谢谢你

编辑:-5/10


你好,如果我不清楚,对不起。让我再解释一遍。我想开发一些接受JSON集合的通用方法。这个JSON有许多不同的字段。 假设集合具有5个JSON。所有5个JSON都有相同数量的字段和不同的值,或者可能是相同的值

现在我想比较JSON的第1个数和第N个数。确定已更改的字段。将该字段作为集合中的旧值/新值。旧值将是N个字段值,新值将是1个字段值。对于其他JSON,继续这样做。现在将第一个数字与N-1进行比较。并确定更改字段。继续此操作直到所有收集完成

返回值包括字段和旧值、新值

该字段可以按字符串、日期编号来显示

我可以使用for循环,但我需要一些通用的方法,它既省时又符合新的C#特性

希望这次我清楚了。

非常感谢..

使用dynamic并将Json对象转换为以下内容

 dynamic data= JsonConvert.DeserializeObject(your Json Object);

然后对数据使用普通的foreach循环进行比较

您可以将每个
JSON
对象转换为
List
,其中字符串表示一个或多个
JSON
属性。然后使用
方法比较这些列表。每个
JSON
对象被序列化为
string
,然后被
拆分。通过拆分,
JSON
属性被提取
objArray
是包含
JSON
对象的数组

        List<List<string>> jsonAttList = new List<List<string>>();

        int objArrayLength = objArray.Length;
        for (int i = 0; i < objArrayLength; i++)
        {
            string objString = JsonConvert.SerializeObject(objArray[i]);
            jsonAttList.Add(objString.Split(',').ToList());
        }
两个
JSON
对象之间的区别是字符串列表

第一个和第二个
JSON
对象之间的区别是包含以下内容的列表:
“MemCode”:1
“myObj”:{“X”:1
“Y”:2}
“D”:1}

        var difference01 = jsonAttList[0].Except(jsonAttList[1]).ToList();
        var difference02 = jsonAttList[0].Except(jsonAttList[2]).ToList();
        var difference03 = jsonAttList[0].Except(jsonAttList[3]).ToList();
第一个和第三个
JSON
对象之间的区别是包含以下内容的列表:
“MemCode”:1
“Y”:2}
“D”:1}

        var difference01 = jsonAttList[0].Except(jsonAttList[1]).ToList();
        var difference02 = jsonAttList[0].Except(jsonAttList[2]).ToList();
        var difference03 = jsonAttList[0].Except(jsonAttList[3]).ToList();
第一个和第四个
JSON
对象之间的区别是包含以下内容的列表:
“MemCode”:1
“Y”:2}
“D”:1}

        var difference01 = jsonAttList[0].Except(jsonAttList[1]).ToList();
        var difference02 = jsonAttList[0].Except(jsonAttList[2]).ToList();
        var difference03 = jsonAttList[0].Except(jsonAttList[3]).ToList();
第四个和第一个
JSON
对象之间的区别是包含以下内容的列表:
“MemCode”:2
“Y”:2
“Z”:3}
“D”:4}

        var difference30 = jsonAttList[3].Except(jsonAttList[0]).ToList();

如果您使用动态反序列化器,那么它将识别类型,然后您可以为该类型使用默认比较器您尝试了什么来获得结果?预期结果是什么,字段更改意味着什么?您好,如果我不清楚,很抱歉。让我再解释一遍。谢谢你的回复。我知道这件事,但我想要一个概括的解决方案。它可以接受集合中具有不同字段数的任何JSON。假设集合中有5个JSON字符串。我想将第一个字段与第五个字段进行比较,并确定哪个字段发生了变化。在第二个JSON之后,将其与第五个JSON进行比较,并确定更多的更改,等等……非常感谢Marko。这有可能是通用的解决方案吗?我明白你的意思。我也有类似的解决方案,但我不想要任何for循环。我想要一些通用的解决方案。你知道吗?非常感谢。您好@user13509456,很抱歉回复太晚。我很高兴能帮上忙。我已经编辑了答案,并添加了拆分JSON的较短方法。