如何移除NewtonSoft JSON反序列化转换器中的try/catch块?
解决无Schema第三方API反序列化的类型不匹配问题
一、替换try/catch的类型判断逻辑
直接通过Utf8JsonReader的Token类型判断来处理,完全规避try/catch的开销,同时解决复杂数组转string的异常问题:
public class JsonObjectOrArrayToStringConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { switch (reader.TokenType) { case JsonTokenType.Null: return null; case JsonTokenType.StartObject: case JsonTokenType.StartArray: // 完整读取整个对象/数组,直接获取原始JSON字符串 using var document = JsonDocument.ParseValue(ref reader); return document.RootElement.GetRawText(); case JsonTokenType.String: return reader.GetString(); default: // 其他基础类型按需处理,这里直接转字符串返回 return reader.GetRawText(); } } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { if (string.IsNullOrEmpty(value)) { writer.WriteNullValue(); return; } // 写入时尝试还原为原JSON结构,失败则直接写字符串 try { using var document = JsonDocument.Parse(value); document.RootElement.WriteTo(writer); } catch { writer.WriteStringValue(value); } } }
核心逻辑:通过TokenType提前识别null、对象、数组、字符串等类型,用JsonDocument.ParseValue完整读取嵌套结构,再通过GetRawText获取原始JSON字符串,彻底解决之前复杂数组转换时的参数异常。
二、实体类中直接标记使用
在需要适配的不确定字段上添加转换器标记即可:
public class ApiResponse { [JsonConverter(typeof(JsonObjectOrArrayToStringConverter))] public string ProductInfo { get; set; } // 其他固定结构字段... }
三、适配你的需求场景
这个方案完全不需要JsonExtensionData,不用额外处理中间对象,直接把不确定结构的字段转为原始JSON字符串存储,后续如果需要解析该字段的具体内容,直接把字符串反序列化为对应类型即可。
内容的提问来源于stack exchange,提问作者Danilo Cataldo
相关产品推荐
相关产品推荐

