我正在使用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\"}");
现在,所有我能想到的是
- 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
)?有严格的反序列化方法吗?
在此先感谢
它工作得很好,即使我改变JsonConstructor的修饰符私人。 Newtonsoft以某种方式仍然创建这个对象。 – serdar