2014-02-28 51 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)); 
相关问题