使用JsonConvert.DeserializeObject注意事項

在使用JsonConvert.DeserializeObject反序列化自定義對象的時候,我遇到了一個問題。定義了一個對象QueryModel,QueryModel擁有兩個構造方法,私有無參構造方法(private QueryModel())跟一個公共構造方法(public QueryModel(String queryModel))。

public class QueryModel
{
    private QueryModel()
    {
        this.Params = new Hashtable();
    }

    public QueryModel(String queryModel)
    {
        QueryModel qm = new QueryModel();
        try
        {
            qm = JsonConvert.DeserializeObject<QueryModel>(queryModel);
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
        this.Params = qm.Params;
    }

    public Hashtable Params { get; set; }
}

但是當在外部調用

new QueryModel(queryModel)

時會重複調用兩次構造方法。第一次傳入參數是null,第二次纔是正常傳入的參數。這是爲什麼呢?
  在多次調試代碼後,我發現在執行JsonConvert.DeserializeObject的時候會先調用一次構造方法。

  經過對Json反序列化的思考。我猜測應該是 JsonConvert.DeserializeObject 內部實現的時候先實例化了一個對象。然後通過反射對Json字符串中的各個屬性對對象進行賦值。
  因爲在外部實例化對象,所以構造方法必須是public的纔會被調用,如果沒有無參構造方法,JsonConvert.DeserializeObject 則選用帶參數的公共構造方法提供默認參數,以完成實例化。
當然,這個只是我的猜測,具體沒有研究過源碼。若是有興趣的同學,可以研究下 JsonConvert 的源碼。

發佈了24 篇原創文章 · 獲贊 11 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章