【问题标题】:Find differences between C# class and JSON-file查找 C# 类和 JSON 文件之间的差异
【发布时间】:2018-11-15 14:41:18
【问题描述】:

我正在处理与 C# 类/对象相比在 JSON 文件中查找缺失属性的问题。

我得到以下代码:

Public Class Server
{
    string URL { get; set; }
    string servername { get; set; }
    string project { get; set; }
    string type { get; set; }
    int number { get; set; }
}

我得到了一个几乎匹配的 JSON 文件

{
 "URL": "http://www.asdf.com",
 "servername": "myServer",
 "project": "Testproject"
}

与“服务器”类相比,如何识别 JSON 文件中缺失的属性?在这种情况下,缺少两个属性“type”和“number”。 当我将 JSON 文件反序列化到 Class 中时,所有属性都存在,因为它们是使用默认值初始化的。

...
Server myServer = new Server();
Server myServerJSON = JsonConvert.DeserializeObject<Server >({ "URL": "http://www.asdf.com", "servername": "myServer", "project": "Testproject"});
myServer.compareTo(myServerJSON);

我的最终目标如下。我将配置存储在 JSON 文件中,并尝试找出更新类模型后 JSON 文件中缺少哪些属性,因此我可以将这些缺少的值设置为默认值。

【问题讨论】:

  • Deserialize 已经用default(T) 设置了缺少的属性,其中T 是属性类型——引用类型为null,值类型为默认值......
  • 您可能会使用 JSON 模式来验证 JSON

标签: c# json compare configuration-files


【解决方案1】:

反序列化它而不指定转换类型:

Server myServer = new Server();
var myServerJSON = JsonConvert.DeserializeObject({ "URL": "http://www.asdf.com", "servername": "myServer", "project": "Testproject"});

然后使用反射检查属性:

var jsontype = myServerJSON.GetType();
var maintype = myServer.GetType();  
string[] jp = jsontype.GetProperties().Select(x => x.Name).ToArray(); 
var result =  maintype.GetProperties().Where(x=> !jp.Contains(x.Name))

【讨论】:

  • 感谢您的回答。感觉它是正确的方法,但我遇到了问题。 string[] jp = jsontype.GetProperties().Select(x => x.Name);不管用。它返回许多不属于初始 JSON 文件的属性
【解决方案2】:

好吧,您可以尝试手动检查每个变量,如下所示:

Server myServer = new Server();
Server myServerJSON = JsonConvert.DeserializeObject<Server >({ "URL": "http://www.asdf.com", "servername": "myServer", "project": "Testproject"});
myServer.compareTo(myServerJSON);
var val = myServer.GetType().GetProperty("URL").GetValue(myServer, null);
if (myServerJSON.URL === val) {
  // ...
}

但我确信有更快的方法。继续寻找,希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 2013-10-08
    • 2016-07-05
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多