c# - 使用 System.Text.Json 转换不一致的 json 值
问题描述
我正在使用的服务返回一个空数组而不是对象的 null。这会在反序列化过程中导致错误。
System.Text.Json.JsonException :无法将 JSON 值转换为 Models.Error。路径:$.errors | 行号:8 | BytePositionInLine: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 中真的很容易,但不幸的是我不能在这里使用它。
解决方案
一个快速的解决方法是创建转换器的非通用版本:
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; }
}
推荐阅读
- python - 如何按长向量列对数据帧进行聚类
- angular - 如何以角度运行下载的项目?
- reactjs - 如何使用 html5 视频标签在 reactjs 中创建视频播放列表?
- javascript - NGRX - 重置分配减速器初始状态的状态是否正确?
- matlab - 如何读取多个文本文件并根据文件名中的时间戳将它们合并在一起
- java - Eclipse 产品导出向导显示“找不到产品的定义插件”
- .net - 启动调试适配器失败:VS 尝试连接到随机端口
- python - 基于两列删除重复项并根据另一列的值保持出现
- javascript - 积极的前瞻捕获过多的 JS
- python - 并排合并两个列表