C# 通过反序列化json文件初始化构造函数中的对象数据

C# 通过反序列化json文件初始化构造函数中的对象数据,c#,json,object,constructor,C#,Json,Object,Constructor,我想去掉第一个构造函数,直接反序列化。有没有办法一次从json中提取一个变量?或者有一个总括语句,我可以使用它一次将它们全部拉出来并填充对象 public MasterEmailSettings() { _user = ""; _password = ""; _domain = ""; _emailAddress = ""; } public MasterEmailSettings(string path) { var tem

我想去掉第一个构造函数,直接反序列化。有没有办法一次从json中提取一个变量?或者有一个总括语句,我可以使用它一次将它们全部拉出来并填充对象

 public MasterEmailSettings()
 {
      _user = "";
      _password = "";
      _domain = "";
      _emailAddress = "";
 }
 public MasterEmailSettings(string path)
 {
      var tempObject = new MasterEmailSettings();

      try
      {
           tempObject = JsonConvert.DeserializeObject<MasterEmailSettings>(File.ReadAllText(path));
           _domain = tempObject.Domain;
           _password = tempObject.Password;
           _user = tempObject.User;
           _emailAddress = tempObject.EmailAddress;
      }
      catch (Exception ex)
      {
           Console.WriteLine(ex.ToString());
      }
 }
public MasterEmailSettings()
{
_用户=”;
_密码=”;
_域名=”;
_电子邮件地址=”;
}
公共MasterEmailSettings(字符串路径)
{
var tempObject=新的MasterEmailSettings();
尝试
{
tempObject=JsonConvert.DeserializeObject(File.ReadAllText(path));
_domain=tempObject.domain;
_password=tempObject.password;
_user=tempObject.user;
_emailAddress=tempObject.emailAddress;
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
}

您不能一步设置构造函数中的所有属性


您可以在构造函数中使用
[JsonConstructor]

您不能一步设置构造函数中的所有属性


您可以将
[JsonConstructor]
与您的构造函数一起使用:

就个人而言,我不会创建一个构造函数,它将负责转到磁盘、读取文件、使用第三方库对对象进行反序列化,然后只获取反序列化对象的位并将其放入类的某些字段中。通常,构造函数传递的只是对象初始化,而这将把很多责任都包含在构造函数中,我不确定您是否需要这样做

如果您真的想将这个逻辑封装到这个类的一个空间中,我的一个建议是创建一个工厂方法。factory方法更广泛地表示要初始化类型,需要进行实际工作:

public static MasterEmailSettings Create(string path){
    return JsonConvert.DeserializeObject<MasterEmailSettings>(File.ReadAllText(path))
}
publicstaticmasteremailsettings创建(字符串路径){
返回JsonConvert.DeserializeObject(File.ReadAllText(路径))
}
我不完全确定原始构造函数的用例,其中代码将tempObject设置为对象的反序列化形式,只是从中设置几个字段?我们需要更多的信息

再说一次,你最好还是用

var emailSettings = JsonConvert.DeserializeObject<MasterEmailSettings>(File.ReadAllText(path)) 
var emailSettings=JsonConvert.DeserializeObject(File.ReadAllText(路径))
…在您的代码中,无论您想在哪里使用此功能,但是如果您想稍微封装它,上面的工厂方法将是一个很好的方法

*更新* 我在一篇评论中读到,当您想从磁盘加载此信息时,您不想在周围放置try/catch,这是有道理的。上面的factory方法+try-catch逻辑(其中显式捕获IOException)将是一个很好的impl

public static MasterEmailSettings Create(string path){
    try{
        return JsonConvert.DeserializeObject<MasterEmailSettings>(File.ReadAllText(path))
    }
    catch(IOException ex)
    {
        //Answer how the system should respond in the event that the file did not exist. Maybe you just want to log it and throw?
        throw; //Do not use throw ex as it will re-start the stack trace from the point the exception is thrown. Use either throw or throw new SomeException("", ex); to make sure the original stack trace on the exception is preserved.
    }
}
publicstaticmasteremailsettings创建(字符串路径){
试一试{
返回JsonConvert.DeserializeObject(File.ReadAllText(路径))
}
捕获(IOEX异常)
{
//回答当文件不存在时系统应该如何响应。也许你只是想记录它并抛出它?
throw;//不要使用throw ex,因为它将从引发异常的点重新启动堆栈跟踪。请使用throw或throw new SomeException(“,ex”);以确保保留异常上的原始堆栈跟踪。
}
}

有一些其他的异常可以抛出,你可能想考虑它们,以及你的代码应该如何回应它们:

< P>个人,我不会创建一个构造函数,它将负责到磁盘,在文件中读取,使用第三方LIB对对象反序列化,然后只获取反序列化对象的位并将其放入类的某些字段中。通常,构造函数传递的只是对象初始化,而这将把很多责任都包含在构造函数中,我不确定您是否需要这样做

如果您真的想将这个逻辑封装到这个类的一个空间中,我的一个建议是创建一个工厂方法。factory方法更广泛地表示要初始化类型,需要进行实际工作:

public static MasterEmailSettings Create(string path){
    return JsonConvert.DeserializeObject<MasterEmailSettings>(File.ReadAllText(path))
}
publicstaticmasteremailsettings创建(字符串路径){
返回JsonConvert.DeserializeObject(File.ReadAllText(路径))
}
我不完全确定原始构造函数的用例,其中代码将tempObject设置为对象的反序列化形式,只是从中设置几个字段?我们需要更多的信息

再说一次,你最好还是用

var emailSettings = JsonConvert.DeserializeObject<MasterEmailSettings>(File.ReadAllText(path)) 
var emailSettings=JsonConvert.DeserializeObject(File.ReadAllText(路径))
…在您的代码中,无论您想在哪里使用此功能,但是如果您想稍微封装它,上面的工厂方法将是一个很好的方法

*更新* 我在一篇评论中读到,当您想从磁盘加载此信息时,您不想在周围放置try/catch,这是有道理的。上面的factory方法+try-catch逻辑(其中显式捕获IOException)将是一个很好的impl

public static MasterEmailSettings Create(string path){
    try{
        return JsonConvert.DeserializeObject<MasterEmailSettings>(File.ReadAllText(path))
    }
    catch(IOException ex)
    {
        //Answer how the system should respond in the event that the file did not exist. Maybe you just want to log it and throw?
        throw; //Do not use throw ex as it will re-start the stack trace from the point the exception is thrown. Use either throw or throw new SomeException("", ex); to make sure the original stack trace on the exception is preserved.
    }
}
publicstaticmasteremailsettings创建(字符串路径){
试一试{
返回JsonConvert.DeserializeObject(File.ReadAllText(路径))
}
捕获(IOEX异常)
{
//回答当文件不存在时系统应该如何响应。也许你只是想记录它并抛出它?
throw;//不要使用throw ex,因为它将从引发异常的点重新启动堆栈跟踪。请使用throw或throw new SomeException(“,ex”);以确保保留异常上的原始堆栈跟踪。
}
}

<> P>有一些其他的异常可以抛出,你可能想考虑它们,以及你的代码应该如何回应它们:

< P>我把它分开了一点不同。我同意前面关于从对象中删除文件读取的回答,并且
var settings = MasterEmailSettings.Load("yourpath");