【问题标题】:Compare Json Collection, return change values比较 Json Collection,返回变化值
【发布时间】:2020-05-15 06:50:29
【问题描述】:

我有不同领域的 Json Collection。所有字段都是动态的。请看下面的例子。

[{"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。 对于所有领域都是明智的。该字段可以是任何类型,如日期时间/字符串等。这只是示例。 JSON 可能很长,有很多字段。但所有 json 字符串都是相同的字段。

所有字段都是动态的。我想要一些方法来进行上述计算并使用旧值和新值返回字段更改。

我想使用 C# 和 Newtonsoft.Json。我不知道如何实现上述一个。你能帮我/指导我吗?

提前谢谢你。

编辑:- 5/10

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

现在我想比较第一个 JSON 数和 N 个 JSON。确定哪个字段已更改。取那个字段,它是集合中的旧值/新值。旧值将是 N 个字段值,新值将是 1 个字段值。对其他 JSON 继续这种方式。现在第一个数字 JSON 与 N-1 进行比较。并识别更改字段。以这种方式继续直到所有收集完成。

返回值是字段和旧值,新值。

该字段可以是字符串,日期的数字。

我可以使用 for 循环,但我想要一些通用的方法,既省时又符合新的 C# 功能。

希望这次我说清楚了。
非常感谢。。

【问题讨论】:

  • 如果您使用动态反序列化器,那么它将识别类型,然后您可以使用该类型的默认比较器
  • 你尝试过什么来达到这个结果?预期的结果是什么,字段变化是什么意思?
  • 您好,如果我不清楚,对不起。让我再解释一次。

标签: c# json


【解决方案1】:

使用动态并将您的 Json 对象转换为波纹管

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

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

【讨论】:

  • 感谢您的回复。我知道这件事,但我想要一些通用的解决方案。它可以接受具有集合中不同字段数量的任何 JSON。假设 Collection 中有 5 个 JSON 字符串。我想将 First 与 Five one 进行比较,并确定哪个字段发生了变化。在那之后,第二个 JSON 与第五个比较,并确定更多的变化等等......
【解决方案2】:

您可以将每个JSON 对象转换为List<string>,其中字符串表示一个或多个JSON 属性。然后使用Except 方法比较这些列表。每个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());
        }

或者更短

List<List<string>> jsonAttList = new List<List<string>>();
objArray.ForEach(item => jsonAttList.Add(JsonConvert.SerializeObject(item).Split(',').ToList()));

这里有四个示例,您提供了一个附加属性。

[{"KB":"1","Id":"01","MemCode":1,"A":"2","B":"1","myObj":{"X":1,"Y":2},"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","myObj":{"X":1,"Y":3},"C":"2010-01-01T00:00:00","D":3},
{"KB":"1","Id":"01","MemCode":2,"A":"2","B":"1","myObj":{"X":1,"Y":2,"Z":3},"C":"2010-01-01T00:00:00","D":4}]

两个JSON 对象之间的区别在于字符串列表。

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

        var difference01 = jsonAttList[0].Except(jsonAttList[1]).ToList();

第一个和第三个JSON 对象之间的区别是列表包含:"MemCode":1"Y":2}"D":1}

        var difference02 = jsonAttList[0].Except(jsonAttList[2]).ToList();

第一个和第四个 JSON 对象之间的区别在于列表包含:"MemCode":1"Y":2}"D":1}

        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();

【讨论】:

  • 非常感谢马尔科。是否有可能的通用解决方案?我明白你的意思了。我也有类似的解决方案,但我不想要任何 for 循环。我想要一些通用的解决方案。你有什么主意吗 ?非常感谢。
  • 嗨@user13509456,很抱歉回复晚了。我很高兴能帮上忙。我已经编辑了答案并添加了更短的方式来拆分 JSON。
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多