Моя проблема в том, что я не могу заставить работать «UnknownDerivedTypeHandling».
System.Text.Json и .net9.
Код: Выделить всё
// https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/polymorphism
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type", UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
[JsonDerivedType(typeof(RecordClass))]
[JsonDerivedType(typeof(RecordProfileClass), typeDiscriminator: "profile")]
[JsonDerivedType(typeof(RecordAccountClass), typeDiscriminator: "account")]
public class RecordClass
{
[JsonPropertyName("$type")]
public string RecordType { get; set; } = string.Empty;
[JsonPropertyName("createdAt"), JsonRequired]
public DateTime Created { get; set; }
}
public class RecordProfileClass : RecordClass
{
[JsonPropertyName("description")]
public string Description { get; set; } = string.Empty;
[JsonPropertyName("displayName"), JsonRequired]
public string DisplayName { get; set; } = string.Empty;
}
public class RecordAccountClass : RecordClass
{
[JsonPropertyName("userprincipalname"), JsonRequired]
public string UserPrincipalName{ get; set; } = string.Empty;
[JsonPropertyName("objectId"), JsonRequired]
public Guid ObjectId { get; set; } = Guid.Empty;
}
Код: Выделить всё
System.Text.Json.JsonException: 'Read unrecognized type discriminator id 'guest'. Path: ...
Я несколько раз читал страницу Microsoft «Как сериализовать свойства производных классов с помощью System.Text.Json», но до сих пор не понимаю, что делаю неправильно.
Мой JsonSerializerOptions
Код: Выделить всё
JsonSerializerOptions jsonOptions = new JsonSerializerOptions()
{
RespectNullableAnnotations = true,
WriteIndented = true
};
JsonSerializer.Deserialize(messageJson, jsonOptions);
Код: Выделить всё
public class MessageClass
{
[JsonPropertyName("did"), JsonRequired]
public string Did { get; set; } = string.Empty;
[JsonPropertyName("time_us"), JsonRequired]
public long Time_US { get; set; } = 0;
[JsonPropertyName("commit")]
public CommitClass? Commit { get; set; } = null;
// There is more, but not relevant...
}
public class CommitClass
{
[JsonPropertyName("rev"), JsonRequired]
public string Rev { get; set; } = string.Empty;
[JsonPropertyName("operation"), JsonRequired]
public string Operation { get; set; } = string.Empty;
// There is more, but not relevant...
// THE BASE CLASS
[JsonPropertyName("record")]
public RecordClass? Record { get; set; }
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... -id-new-ty
Мобильная версия