Did you know by default JsonSerializer doesn't serialize Properties of Derived Classes?
Say we have the following classes.
public class Person
{
public string Name { get; set; }
}
public class Student : Person
{
public int StudentId { get; set; }
}
I am creating a Student, but I am assigning it to a Person.
Person person = new Student
{
Name = "John Doe",
StudentId = 1
};
Now if I serialize this using Json.NET,
var options = new Newtonsoft.Json.JsonSerializerSettings
{
Formatting = Newtonsoft.Json.Formatting.Indented,
};
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(person, options));
I am getting the following output. The correct underline type is serialized.
{
"StudentId": 1,
"Name": "John Doe"
}
Now if I serialize the same using JsonSerializer,
var options = new System.Text.Json.JsonSerializerOptions { WriteIndented = true };
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(person, options));
I am getting the following output. You can see it has only serialized the properties that are in the Parent class.
Now we can change this behavior using one of two ways.
- Call an overload of Serialize and ask to use type at run time
- Declare the object to be serialized as an object
var options = new System.Text.Json.JsonSerializerOptions { WriteIndented = true };
// Call an overload of Serialize that lets you specify the type at run time:
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(person, person.GetType(), options));
// Declare the object to be serialized as object
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize<object>(person, options));
And now we can see the correct underline type is getting serialized.
{
"StudentId": 1,
"Name": "John Doe"
}
Hope this helps.
Happy Coding.
Regards,
Jaliya