You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 07:43:24