Json.Net与System.Text.Json间TimeSpan序列化反序列化兼容问题
解决方案
首先明确:不带双引号的03:30:00不符合JSON规范对字符串类型的定义,Json.Net默认不会将其识别为合法字符串进行反序列化。你可以选择以下两种方案解决问题:
方案1:客户端Json.Net添加自定义转换器(适配服务端非法输出)
在Blazor WASM端实现自定义Json.Net转换器,直接解析未加引号的TimeSpan格式文本:
public class TimeSpanNoQuotesConverter : JsonConverter<TimeSpan> { public override TimeSpan ReadJson(JsonReader reader, Type objectType, TimeSpan existingValue, bool hasExistingValue, JsonSerializer serializer) { string timeSpanText = reader.Value?.ToString() ?? string.Empty; return TimeSpan.Parse(timeSpanText); } public override void WriteJson(JsonWriter writer, TimeSpan value, JsonSerializer serializer) { writer.WriteValue(value.ToString()); } }
将转换器注册到NSwag客户端的序列化配置中:
var jsonSettings = new JsonSerializerSettings(); jsonSettings.Converters.Add(new TimeSpanNoQuotesConverter()); // 赋值给NSwag生成的客户端实例的SerializerSettings属性即可
方案2:修正服务端序列化逻辑(推荐)
正常情况下Utf8JsonWriter.WriteStringValue方法会自动给输出内容添加双引号,你当前服务端输出裸文本属于异常现象。可优先排查服务端序列化配置是否存在全局覆盖、转换器执行顺序错误的问题,保证输出符合JSON规范的带引号TimeSpan字符串,无需修改客户端配置即可兼容Json.Net默认反序列化规则。
内容的提问来源于stack exchange,提问作者NPadrutt
相关产品推荐
相关产品推荐

