我正在使用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\"}");
现在我能想到的只有:
- Json转换器在反射时忽略了大小写。
- 此外,如果它遇到构造函数,它会使用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
)?是否有一种严格的反序列化方式?
提前致谢。