System.Text.Json.JsonException: 'Читать идентификатор дискриминатора нераспознанного типа 'new-type'C#

Место общения программистов C#
Ответить
Anonymous
 System.Text.Json.JsonException: 'Читать идентификатор дискриминатора нераспознанного типа 'new-type'

Сообщение Anonymous »

У меня есть документ json, который постоянно увеличивает список дискриминаторов.
Моя проблема в том, что я не могу заставить работать «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;
}

Когда я получаю документ json и используется дискриминатор «нет в списке», десериализация завершилась неудачей с ошибкой:

Код: Выделить всё

System.Text.Json.JsonException: 'Read unrecognized type discriminator id 'guest'. Path: ...
Я надеялся на возможность вернуться к базовому типу, если появился неизвестный дискриминатор с помощью JsonUnknownDerivedTypeHandling.FallBackToBaseType
Я несколько раз читал страницу Microsoft «Как сериализовать свойства производных классов с помощью System.Text.Json», но до сих пор не понимаю, что делаю неправильно.
Мой JsonSerializerOptions

Код: Выделить всё

JsonSerializerOptions jsonOptions = new JsonSerializerOptions()
{
RespectNullableAnnotations = true,
WriteIndented = true
};

JsonSerializer.Deserialize(messageJson, jsonOptions);
MessageClass — это корневой класс, содержащий идентификатор сообщения, время, личности тех, кто «совершил действие» и т. д. Мой код:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»