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

7

我正在使用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)?是否有一种严格的反序列化方式?

提前致谢。

2个回答

7
如何正确反序列化对象(也许在创建对象后覆盖名称)?是否有一种严格的反序列化方式?您可以声明另一个构造函数并强制Json.Net使用它。
public class Dog
{
    public string Name;

    [JsonConstructor]
    public Dog()
    {

    }

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

1
即使我将JsonConstructor的修饰符更改为private,它仍然可以正常工作。Newtonsoft以某种方式仍然使用此构造函数创建对象。 - serdar

0

像这样

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

我猜你是想说 某个类 而不是 某个对象 - knocte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接