我可以使用Newtonsoft.Json进行严格的反序列化吗?

时间:2014-02-28 13:24:55

标签: c# json json.net json-deserialization

我正在使用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字符串中一样)。我不确定,但也许这就是他们称之为灵活的原因。
  3. 我的问题出现了:

    如果我的课程是这样的,

    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)?有没有办法严格反序列化?

    提前致谢

2 个答案:

答案 0 :(得分:7)

  

如何正确反序列化对象(可能在创建对象后覆盖Name)?有没有办法严格反序列化?

您可以声明另一个构造函数并强制Json.Net使用它

public class Dog
{
    public string Name;

    [JsonConstructor]
    public Dog()
    {

    }

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

答案 1 :(得分:-1)

有这样的东西

JsonConvert.DeserializeObject("json string", typeof(some object));