C# Refit反序列化:将响应中false转为null的实现方案
解决C# Refit处理登录接口JSON反序列化异常问题
问题场景
接口成功响应时,payload字段是包含id和name的对象:
{"merchant": "test123","payload": {"id": "1234","name": "Test"},"code": "100","message": "Request successfully executed"}
失败响应时,payload字段值为false:
{"merchant": "test123","payload": false,"code": "105","message": "Invalid username or password!"}
由于无法控制接口返回格式,当前反序列化时会因类型不匹配抛出异常,需要将"payload": false转换为"payload": null。
解决方案:自定义JSON转换器
利用System.Text.Json的自定义转换器,实现布尔值false到null的转换:
1. 创建ResponsePayload转换器
using System.Text.Json; using System.Text.Json.Serialization; namespace Response; public class ResponsePayloadConverter : JsonConverter<ResponseRoot.ResponsePayload?> { public override ResponseRoot.ResponsePayload? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 识别布尔值false,返回null if (reader.TokenType == JsonTokenType.Boolean && !reader.GetBoolean()) { return null; } // 正常反序列化Payload对象 return JsonSerializer.Deserialize<ResponseRoot.ResponsePayload>(ref reader, options); } public override void Write(Utf8JsonWriter writer, ResponseRoot.ResponsePayload? value, JsonSerializerOptions options) { // 序列化时处理null值 if (value == null) { writer.WriteNullValue(); } else { JsonSerializer.Serialize(writer, value, options); } } }
2. 为Payload属性添加转换器特性
修改原实体类,在Payload属性上标记自定义转换器:
using System.Text.Json; using System.Text.Json.Serialization; namespace Response; public class ResponseRoot { public string Merchant { get; set; } [JsonConverter(typeof(ResponsePayloadConverter))] public ResponsePayload? Payload { get; set; } public string Code { get; set; } public string Message { get; set; } public class ResponsePayload { public string Id { get; set; } public string Name { get; set; } } }
3. 配置Refit客户端使用自定义转换器
将转换器加入Json序列化配置,并传递给Refit:
var jsonOptions = new JsonSerializerOptions { Converters = { new ResponsePayloadConverter() }, PropertyNameCaseInsensitive = true, // 忽略属性大小写匹配 PropertyNamingPolicy = JsonNamingPolicy.CamelCase // 适配接口驼峰命名 }; var apiClient = RestService.For<ILoginApi>("https://your-api-domain", new RefitSettings { ContentSerializer = new SystemTextJsonContentSerializer(jsonOptions) });
原理说明
自定义转换器在反序列化时会先检查当前JSON token类型:如果是布尔值且为false,直接返回null;否则正常解析为ResponsePayload对象,完美适配接口两种返回格式,避免类型不匹配异常。
内容的提问来源于stack exchange,提问作者Darrell
相关产品推荐
相关产品推荐

