【问题标题】:Can I make a strict deserialization with Newtonsoft.Json?我可以使用 Newtonsoft.Json 进行严格的反序列化吗?
【发布时间】: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\"}");

现在我能想到的是

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

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

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

    public class Dog
    {
        public string Name;
    
        [JsonConstructor]
        public Dog()
        {
    
        }
    
        public Dog(string name)
        {
            Name = name + "aaa";
        }
    }
    

    【讨论】:

    • 即使我将 JsonConstructor 的修饰符更改为私有,它也能正常工作。 Newtonsoft 不知何故仍然用这个创建对象。
    【解决方案2】:

    这样的事情

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

    【讨论】:

    • 我猜你的意思是some class而不是some object
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多