我有两个结构相同的Json文件,我想比较两个文件之间的差异。我希望只获得列名。例如: Json 1:
{
"Test": [
{
"Cust-no": "00000001",
"Cust-status": "555",
"Last-update": "1999-08-17"
}
]
}Json 2:
{
"Test": [
{
"Cust-no": "00000001",
"Cust-status": "666",
"Last-update": "2018-08-17"
}
]
}预期结果:
[
"Cust-status",
"Last-update"
]发布于 2018-08-29 14:16:58
你可以这样做:
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对象以获得所需的输出。
希望这能有所帮助
发布于 2018-08-29 14:45:02
使用Newtonsoft库可以很容易地做到这一点。在C#中有一个类似于匿名对象的JObject。您可以将json字符串转换为JObject,然后可以循环您的JObject属性并检查它们是否相同。
当然,您可以创建C# poco类,并将您的json转换为下面提到的Praneet类,然后手动进行比较。
检查下面的小提琴。https://dotnetfiddle.net/VCBhCA
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));
}发布于 2018-08-29 15:18:01
尝试这段与json的任何结构无关的代码:
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库
https://stackoverflow.com/questions/52069287
复制相似问题