2015-12-14 53 views
1

我使用newtonsoft json的解串器,和我deserialising一個包裝裏面這個對象:布爾現場deserialisation之後總是返回false(Newtonsoft)

public class User 
{ 
    public string Username; 
    public byte[] HashedPassword; 
    public byte[] Salt; 
    private bool admin; 
    public bool Admin 
    { 
     get { return admin; } 
    } 

    public User(string UsernameArg, byte[] PasswordArg, byte[] SaltArg, bool AdminArg = false) 
    { 
     Username = UsernameArg; 
     HashedPassword = PasswordArg; 
     Salt = SaltArg; 
     admin = AdminArg; 
    } 

    public override string ToString() 
    { 
     return Username; 
    } 
} 

這是我的JSON字符串:

{"Users":[{"Username":"admin","HashedPassword":"password","Salt":"salt","Admin":true}]}

(我編輯的哈希密碼和可讀性鹽)

所以每當我讀到這使用JsonConvert.DeserializeObject<UserDatabaseClass>(jsonRead)管理員字段正在返回false。

難道這只是我誤解了這是在做什麼還是我做錯了?

+0

你必須有一個公共的getter *和* setter,用於所有你想往返的房產。只需要一個公共getter,他們就會被序列化,但是如果沒有setter,他們就不能在反序列化過程中被寫回對象實例。 –

回答

8

由於您的Admin屬性爲只讀 - {get {...}} - 序列化程序無法將其設置爲任何值並將跳過它。

修復:進行實地讀寫,即使用自動屬性

public bool Admin {get;set;} 

你也可能需要無參數的構造爲反序列化工作或使用[JsonConstructor]屬性如圖JSON.net: how to deserialize without using the default constructor?

+0

因此,json序列化程序只適用於公共屬性,因爲我使用的是私人'admin'屬性,因爲我想公共管理屬性無法設置 – Cjen1

+1

@ Cjen1是的,默認情況下,您必須擁有一個公共getter和所有房產的二傳手都可以往返。 [當然,有這個方法。](https://stackoverflow.com/questions/4179093/can-json-net-populate-readonly-fields-in-a-class) –

+0

@ Cjen1默認 - 是的,只有公共屬性/字段和只有默認的構造函數。您可以強制序列化私有字段/屬性,如http://stackoverflow.com/questions/24106986/json-net-force-serialization-of-all-private-fields-and-all-fields-in-sub-但這是非常不尋常的 - 如果序列化私有字段,請務必在代碼中內聯提供良好的解釋(所以後面的你/別人可以理解正在發生的事情) –