Могу ли я сделать строгую десериализацию с 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"}");

теперь все, что я могу думать, это

  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 ответов


Как правильно десериализовать объект (возможно, переопределить имя после создания объекта)? Есть ли способ строгой десериализации?

вы можете объявить другой конструктор и force Json.Net использовать его

public class Dog
{
    public string Name;

    [JsonConstructor]
    public Dog()
    {

    }

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

С чем-то вроде этого

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