TypeNameHandling setting
April 6, 2024 ยท View on GitHub
This sample uses the Argon.TypeNameHandling setting to include type information when serializing JSON and read type information so that the correct types are created when deserializing JSON.
public abstract class Business
{
public string Name { get; set; }
}
public class Hotel : Business
{
public int Stars { get; set; }
}
public class Stockholder
{
public string FullName { get; set; }
public IList<Business> Businesses { get; set; }
}
var stockholder = new Stockholder
{
FullName = "Steve Stockholder",
Businesses =
[
new Hotel
{
Name = "Hudson Hotel",
Stars = 4
}
]
};
var jsonTypeNameAll = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
Console.WriteLine(jsonTypeNameAll);
// {
// "$type": "Argon.Samples.Stockholder, ArgonTests",
// "FullName": "Steve Stockholder",
// "Businesses": {
// "$type": "System.Collections.Generic.List`1[[Argon.Samples.Business, ArgonTests]], mscorlib",
// "$values": [
// {
// "$type": "Argon.Samples.Hotel, ArgonTests",
// "Stars": 4,
// "Name": "Hudson Hotel"
// }
// ]
// }
// }
var jsonTypeNameAuto = JsonConvert.SerializeObject(stockholder, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
Console.WriteLine(jsonTypeNameAuto);
// {
// "FullName": "Steve Stockholder",
// "Businesses": [
// {
// "$type": "Argon.Samples.Hotel, ArgonTests",
// "Stars": 4,
// "Name": "Hudson Hotel"
// }
// ]
// }
// for security TypeNameHandling is required when deserializing
var newStockholder = JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
Console.WriteLine(newStockholder.Businesses[0].GetType().Name);
// Hotel