簡體   English   中英

將json反序列化為對象時調用構造函數

[英]Call the constructor when Deserializing json to object

我有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。

這就是errorMessage is email is empty的原因。

relevantEmail電子郵件是來自 ajax 的電子郵件(沒關系)。

我真的不知道為什么構造函數沒有得到 ajax 調用發送的參數。

任何幫助表示贊賞!

序列化/反序列化只能調用默認構造函數 - 假設您將有多個帶有各種參數的構造函數 - 框架如何猜測要調用哪個/哪些參數? 此外,可序列化的字段應該是屬性。 所以你的對象應該是這樣的:

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";
    }
}

使用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM