将json反序列化为对象时调用构造函数

时间:2015-04-04 07:25:47

标签: c#

我有LoginModels

public class LoginModels
{
    public LoginModels(string userEmail, string userPassword)
    {
        email = userEmail;
        password = userPassword;
        errorMessage = GetLoginError();
    }

    public string email;
    public string password;
    public string errorMessage;

    public string GetLoginError()
    {
        if (string.IsNullOrEmpty(email)) return "email is empty";
        else return "good";
    }
}

我发送了一个json到控制器的函数..

在控制器中,我写道:

LoginModels user = JsonConvert.DeserializeObject<LoginModels>(userDetails);
string relevantEmail = user.email;

LoginModels的构造函数为emailpassword为null。

这就是errorMessageemail is empty的原因。

relevantEmail是来自ajax的电子邮件(并且没问题)。

我真的不知道为什么构造函数没有得到ajax调用发送的参数。

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

序列化/反序列化只能调用默认构造函数 - 假设您将拥有多个具有各种参数的构造函数 - 框架如何猜测哪一个调用/哪些参数?此外,可序列化字段应该是属性。所以你的对象应该是这样的:

public class LoginModels
{
    private string _errorMessage;

    // default ctor for serialization
    public LoginModels() 
    {
    }

    public LoginModels(string userEmail, string userPassword)
    {
        email = userEmail;
        password = userPassword;
    }

    public string email { get; set; }
    public string password { get; set; }
    public string errorMessage 
    { 
        get 
        { 
            if (string.IsNullOrEmpty(_errorMessage))
            {
                _errorMessage = GetLoginError();
            }
            return _errorMessage;
        } 
        set { _errorMessage = value; }
    }

    public string GetLoginError()
    {
        if (string.IsNullOrEmpty(email))
        {
            return "email is empty";
        }
        // also no need for "else" here
        return "good";
    }
}

答案 1 :(得分:1)

使用JsonConstructor属性,以便您的JsonConvert知道要使用哪个构造函数:

using using Newtonsoft.Json;;    

public class LoginModels
{
  [JsonConstructor]
  public LoginModels(string userEmail, string userPassword)
  {
      email = userEmail;
      password = userPassword;
      errorMessage = GetLoginError();
  }

  public string email;
  public string password;
  public string errorMessage;

  public string GetLoginError()
  {
      if (string.IsNullOrEmpty(email)) return "email is empty";
      else return "good";
  }
}

以下是来源:https://www.newtonsoft.com/json/help/html/JsonConstructorAttribute.htm