【发布时间】:2014-04-01 12:43:06
【问题描述】:
我正在使用 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)?有没有办法严格反序列化?
提前致谢
【问题讨论】:
标签: c# json json.net json-deserialization