比较两个json对象,并返回另一个JSON对象,仅更改c#

时间:2019-06-03 12:00:41

标签: c# json

我想比较两个JSON对象,并返回另一个对象,只在一个JSON对象中缺少属性。例如:

json1 = {
   "name": "ABCD",
   "hobbies": [
     {
       "water_hobby1": "Rafting",
       "water_hobby2": "swimming",
     },
     {
       "hobby3": "Singing",
       "hobby4": "Drawing",
     }
    ]
}

json2 = {
   "name": "ABCD",
   "hobbies": [
     {
       "hobby3": "Singing",
       "hobby4": "Drawing",
     }
    ]
}

预期输出:

json = {
  "hobbies": [
     {
           "water_hobby1": "Rafting",
           "water_hobby2": "swimming",
         },
   ]
}

可以说我写了json1.getDiff(json2);我希望生成的json仅包含json2中缺少并且存在于json1中的属性。属性和属性本身的嵌套是动态的。

我的实际JSOn如下:

{
  "property1": 0,
  "property2": "value1",
  "property3": [
    {
      "name": "value2",
      "property4": [
        {
          "property5": 0,
          "name": "value3",
          "porperty6": 0,
          "property7": [
            {
              "name": "",
              "property": 0,
              "property": value,
              "property": "value",
              "property": "value",
              "property": "value"
            },
            {
              "name": "",
              "property": 0,
              "property": value,
              "property": "value",
              "property": "value",
              "property": "value"
            },
            {
              "name": "",
              "property": 0,
              "property": value,
              "property": "value",
              "property": "value",
              "property": "value"
            },
            {
              "name": "",
              "property": 0,
              "property": value,
              "property": "value",
              "property": "value",
              "property": "value"
            },
            {
              "name": "",
              "property": 0,
              "property": value,
              "property": "value",
              "property": "value",
              "property": "value"
            },
            {
              "name": "",
              "property": 0,
              "property": value,
              "property": "value",
              "property": "value",
              "property": "value"
            },
            {
              "name": "",
              "property": 0,
              "property": value,
              "property": "value",
              "property": "value",
              "property": "value"
            },
            {
              "name": "",
              "property": 0,
              "property": value,
              "property": "value",
              "property": "value",
              "property": "value"
            }
          ]
        },
		{
			Many Such Objects With nested array and objects
		}]
	},
	{
		"name": "value",
        "property4": []
	}
}
	

假设我的源JSON包含Property7 [0]对象,但是我的另一个JSON对象不包含Property7 [0]对象。我只想返回Property7 [0]作为我的输出。我下面的代码返回整个Property7数组,该数组显然不包含property7 [0]对象。但这不是我想要的。代码没有遍历数组Property7中的对象。我寻求一些帮助我实现这一目标的方法。

2 个答案:

答案 0 :(得分:1)

如果还不算太晚,或者有人来这里寻找一个比较两个JSON对象(或几乎任何可序列化的实体)的轻量级库,则可以使用以下程序包,(目前)使用Newtonsoft.Json JObjects并突出显示差异如下所示基于一个简单约定(*修改,-删除,+从/添加到第二个操作数)。

JSON 1

{
  "name":"John",
  "age":30,
  "cars": {
    "car1":"Ford",
    "car2":"BMW",
    "car3":"Fiat"
  }
 }

JSON 2

{
  "name":"John",
  "cars": {
    "car1":"Ford",
    "car2":"BMW",
    "car3":"Audi",
    "car4":"Jaguar"
  }
 }

用法


 var j1 = JToken.Parse(Read(json1));
 var j2 = JToken.Parse(Read(json2));

 var diff = JsonDifferentiator.Differentiate(j1,j2);

结果

{
  "-age": 30,
  "*cars": {
    "*car3": "Fiat",
    "+car4": "Jaguar"
  }
}

https://www.nuget.org/packages/JsonDiffer

答案 1 :(得分:0)

首先,您必须为自己定义此“ diff”。例如:两个对象都具有某些属性但值不同时,应该返回什么?

根据您的定义(仅比较两个对象的属性)编写一些代码并不难。我认为这篇文章可以为您提供帮助:Find and return JSON differences using newtonsoft in C#?