2014-02-28 78 views
7

我正在使用Newtonsoft.Json序列化/反序列化對象。
據我所知,如果類沒有無參數構造函數,反序列化不能成功。例如,我可以使用Newtonsoft.Json進行嚴格的反序列化嗎?

public class Dog 
{ 
    public string Name; 

    public Dog(string n) 
    { 
     Name = n; 
    } 
} 

對於此類,下面的代碼會正確生成對象。

Dog dog1 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"Name\":\"Dog1\"}"); 

對我來說,令人驚訝的是,它使用下面的代碼也能正確生成對象。

Dog dog2 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"name\":\"Dog2\"}"); 
Dog dog3 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"n\":\"Dog3\"}"); 
Dog dog4 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"N\":\"Dog4\"}"); 

現在,所有我能想到的是

  1. Json的轉換器是忽略大小寫敏感,而這樣做的反射。
  2. 此外,如果它面向構造函數,它將使用json字符串填充參數(就像參數名稱在json字符串中一樣)。我不確定,但也許這就是他們稱之爲靈活的原因。

這裏我的問題是:

如果我的課是這樣的,

public class Dog 
{ 
    public string Name; 

    public Dog(string name) 
    { 
     Name = name + "aaa"; 
    } 
} 

,併產生物體

Dog dog1 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dog>("{\"Name\":\"Dog1\"}"); 

然後創建的對象給我dog1.Name = "Dog1aaa",而不是dog1.Name = "Dog1" 。我如何正確反序列化對象(可能在創建對象後覆蓋Name)?有嚴格的反序列化方法嗎?

在此先感謝

回答

7

我怎樣才能正確地反序列化對象(創建對象後,可能覆蓋名稱)?有嚴格的反序列化方法嗎?

可以聲明另一個構造,並迫使Json.Net使用它

public class Dog 
{ 
    public string Name; 

    [JsonConstructor] 
    public Dog() 
    { 

    } 

    public Dog(string name) 
    { 
     Name = name + "aaa"; 
    } 
} 
+1

它工作得很好,即使我改變JsonConstructor的修飾符私人。 Newtonsoft以某種方式仍然創建這個對象。 – serdar

-1

像這樣的東西

JsonConvert.DeserializeObject("json string", typeof(some object)); 
相關問題