Я думаю, что в этом случае, вероятно, проще создать свой собственный класс JsonConverter<T>
. Тогда вам не нужно беспокоиться о JsonElement
и преобразовывать значения по мере их поступления.
public class MyCustomConverter : JsonConverter<Data>
{
public override Data Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException();
}
var data = new Data();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
{
return data;
}
if (reader.TokenType == JsonTokenType.PropertyName)
{
string propertyName = reader.GetString();
reader.Read();
switch (propertyName)
{
case "Id":
data.Id = reader.GetInt32();
break;
case "Name":
if (reader.TokenType == JsonTokenType.Number)
{
data.Name = reader.GetInt32();
}
else if (reader.TokenType == JsonTokenType.String)
{
data.Name = reader.GetString();
}
break;
}
}
}
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, Data value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
Затем вы можете добавить этот преобразователь в настройки JSON сериализатора и десериализовать ваши JSON:
var serializeOptions = new JsonSerializerOptions();
serializeOptions.Converters.Add(new MyCustomConverter());
var data = JsonSerializer.Deserialize<List<Data>>(test, serializeOptions);
Полная демонстрация по dotnetfiddle. net