I have compared objects by serializing them.
First here my models are,
To serialize json objects
public class YourClass {
public string name { get; set; }
public int age { get; set; }
public List<long> phone { get; set; }
public List<Address> address { get; set; }
}
public class Address {
public string address1 { get; set; }
public string address2 { get; set; }
public string addressLine1 { get; set; }
public string addressLine2 { get; set; }
public AdditionalInformation additionalInfo { get; set; }
}
public class AdditionalInformation {
public int pin { get; set; }
public string landmark { get; set; }
}
Then to deserialize from this model
public class ResultItem {
public ResultItem(string fieldName, string targetValue, string sourceValue) {
this.fieldName = fieldName;
this.targetValue = targetValue;
this.sourceValue = sourceValue;
}
public string fieldName { get; set; }
public string targetValue { get; set; }
public string sourceValue { get; set; }
}
And the following code gets the differences,
string json1 = @"{'name': 'Kirk','age': 23,'phone': [123123123,141414],'address': [{'address1': '123','address2': '124'},{'address1': '123','address2': '144',
'additionalInfo': {'pin': 123321,'landmark': 'landmark1'}},{'address1': '1223','addressLine2': '1242'}]}";
string json2 = @"{'name': 'Shawn','age': 23,'phone': [7852698,141414],'address': [{'address1': '333','address2': '567'},{'address1': '123','address2': '1414',
'additionalInfo': {'pin': 1236381,'landmark': 'landmark3'}}]}";
var sample1 = JsonConvert.DeserializeObject<YourClass>(json1);
var sample2 = JsonConvert.DeserializeObject<YourClass>(json2);
var result = new List<ResultItem>();
if (!sample1.name.Equals(sample2.name))
result.Add(new ResultItem("name", sample2.name, sample1.name));
if (sample1.age != sample2.age)
result.Add(new ResultItem("age", sample2.age.ToString(), sample1.age.ToString()));
for(int i=0;i< sample1.address.Count; i++) {
if (sample1.address.Count>i && sample2.address.Count>i && sample1.address[i].address1!=sample2.address[i].address1)
result.Add(new ResultItem($"address[{i}].address1", sample2.address[i].address1, sample1.address[i].address1));
if (sample1.address.Count > i && sample2.address.Count > i && sample1.address[i].address2!=sample2.address[i].address2)
result.Add(new ResultItem($"address[{i}].address2", sample2.address[i].address2, sample1.address[i].address2));
if (sample1.address.Count > i && sample2.address.Count > i && sample1.address[i].addressLine1!=sample2.address[i].addressLine1)
result.Add(new ResultItem($"address[{i}].addressLine1", sample2.address[i].addressLine1, sample1.address[i].addressLine1));
if (sample1.address.Count > i && sample2.address.Count > i && sample1.address[i].addressLine2!=sample2.address[i].addressLine2)
result.Add(new ResultItem($"address[{i}].addressLine2", sample2.address[i].addressLine2, sample1.address[i].addressLine2));
if (sample1.address[i].additionalInfo!=null && sample2.address[i].additionalInfo!=null && sample1.address[i].additionalInfo.pin != sample2.address[i].additionalInfo.pin)
result.Add(new ResultItem($"address[{i}].additionalInfo.pin", sample2.address[i].additionalInfo.pin.ToString(), sample1.address[i].additionalInfo.pin.ToString()));
if (sample1.address.Count > i && sample2.address.Count > i && sample2.address[i].additionalInfo!=null && sample1.address[i].additionalInfo!=null && !sample1.address[i].additionalInfo.landmark.Equals(sample2.address[i].additionalInfo.landmark))
result.Add(new ResultItem($"address[{i}].additionalInfo.landmark", sample2.address[i].additionalInfo.landmark, sample1.address[i].additionalInfo.landmark));
}
string jsonResult = JsonConvert.SerializeObject(result);
and jsonResult returns the following
[
{
"fieldName":"name",
"targetValue":"Shawn",
"sourceValue":"Kirk"
},
{
"fieldName":"address[0].address1",
"targetValue":"333",
"sourceValue":"123"
},
{
"fieldName":"address[0].address2",
"targetValue":"567",
"sourceValue":"124"
},
{
"fieldName":"address[1].address2",
"targetValue":"1414",
"sourceValue":"144"
},
{
"fieldName":"address[1].additionalInfo.pin",
"targetValue":"1236381",
"sourceValue":"123321"
},
{
"fieldName":"address[1].additionalInfo.landmark",
"targetValue":"landmark3",
"sourceValue":"landmark1"
}
]