我正在使用的服務為物件回傳一個空陣列而不是 null。這會在反序列化程序中導致錯誤。
System.Text.Json.JsonException:無法將 JSON 值轉換為 Models.Error。路徑:$.errors | 行號:8 | 位元組位置行內:13。
示例#1:
{
"data": {
"code": 100,
"message": "Success",
"authority": "A00000000000000000000000000112233444",
"fee_type": "Payer",
"fee": 10
},
"errors": []
}
示例#2:
{
"data": [],
"errors": {
"code": -9,
"message": "The input params invalid, validation error."
}
}
這是它想出的:
internal class InconsistentConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.StartArray)
{
_ = reader.Read();
return default;
}
return JsonSerializer.Deserialize<T>(ref reader, options);
}
public override void Write(Utf8JsonWriter writer, T objectToWrite, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
}
我也想將轉換器用于資料:
public class Result<T>
where T : class
{
[JsonPropertyName("data")]
[JsonConverter(typeof(InconsistentConverter<T>))] // can't do this
public T? Data { get; set; }
[JsonPropertyName("errors")]
[JsonConverter(typeof(InconsistentConverter<Error>))] // this works
public Error? Error { get; set; }
}
我想這在 Json.NET 中會很容易,但不幸的是我不能在這里使用它。
uj5u.com熱心網友回復:
一個快速的解決方法是創建轉換器的非通用版本:
internal class InconsistentConverter : JsonConverter<object>
{
public override bool CanConvert(Type typeToConvert) => true;
public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.StartArray)
{
_ = reader.Read();
return default;
}
var deserialize = JsonSerializer.Deserialize(ref reader, typeToConvert, options);
return deserialize;
}
public override void Write(Utf8JsonWriter writer, object objectToWrite, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
}
并將其用于通用屬性:
public class Result<T>
where T : class
{
[JsonPropertyName("data")]
[JsonConverter(typeof(InconsistentConverter))]
public T? Data { get; set; }
[JsonPropertyName("errors")]
[JsonConverter(typeof(InconsistentConverter<Error>))] // this works
public Error? Error { get; set; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/346599.html
