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

如何用RestSharp将JSON多整数字段反序列化为同一数组?

解决RestSharp将多字段JSON反序列化为单个数组的问题

嘿,这个需求我之前碰到过,确实RestSharp默认的序列化器(不管是用System.Text.Json还是Newtonsoft.Json)都没有内置特性直接实现“把多个不同名称的整数字段合并到同一个数组”——毕竟像[JsonProperty]这类映射特性是不允许重复标注的。不过有几个简洁的方案,能尽量减少额外代码,满足你的需求:

方案1:动态提取(最省事,几乎无额外代码)

如果你的字段数量不多,完全可以直接把响应反序列成dynamic类型,然后手动把需要的字段值拎出来放到数组里:

var client = new RestClient("你的API基础地址");
var request = new RestRequest("目标接口路径");
var response = await client.GetAsync<dynamic>(request);

// 把所有需要的整数字段提取到数组里
var intArray = new[] { 
    (int)response.value1, 
    (int)response.value2, 
    (int)response.value3 
    // 有其他字段就继续加在这里
};

这种方式不用定义额外的类或者转换器,几行代码就能搞定,非常适合快速解决问题。

方案2:定义响应类+只读数组属性(类型安全,适合复用)

如果字段比较多,或者需要在多个地方复用这个逻辑,可以先定义一个包含所有目标字段的类,然后加个只读属性自动把这些字段的值收集成数组:

public class ApiResponse
{
    // 这里对应JSON里的所有整数字段名称
    public int Value1 { get; set; }
    public int Value2 { get; set; }
    public int Value3 { get; set; }
    // 其他需要的字段...

    // 自动把所有字段值打包成数组
    public int[] AllValues => new[] { Value1, Value2, Value3 /* 把其他字段也加上 */ };
}

之后正常反序列化就好了,直接拿AllValues就是你要的数组:

var response = await client.GetAsync<ApiResponse>(request);
var intArray = response.AllValues;

这种方式类型安全,代码也很简洁,适合需要多次使用的场景。

方案3:自定义序列化转换器(适合复杂/动态场景)

如果你的字段名是动态变化的,或者完全不想手动提取,可以写个自定义的JSON转换器,然后配置到RestSharp里。

用System.Text.Json的转换器示例:

public class MultiFieldIntArrayConverter : JsonConverter<int[]>
{
    private readonly HashSet<string> _targetFields;

    // 构造函数传入需要匹配的字段名
    public MultiFieldIntArrayConverter(params string[] fieldNames)
    {
        _targetFields = new HashSet<string>(fieldNames);
    }

    public override int[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType != JsonTokenType.StartObject)
            throw new JsonException("JSON格式不对,应该是一个对象");

        var values = new List<int>();

        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndObject) break;

            if (reader.TokenType == JsonTokenType.PropertyName)
            {
                var propName = reader.GetString();
                if (_targetFields.Contains(propName))
                {
                    reader.Read();
                    if (reader.TryGetInt32(out int val))
                        values.Add(val);
                }
                else
                {
                    // 跳过不需要的字段
                    reader.Skip();
                }
            }
        }

        return values.ToArray();
    }

    public override void Write(Utf8JsonWriter writer, int[] value, JsonSerializerOptions options)
    {
        // 如果不需要把数组序列化回JSON,这里可以直接抛出异常或者留空
        throw new NotImplementedException();
    }
}

然后配置RestSharp使用这个转换器:

var clientOptions = new RestClientOptions("你的API基础地址")
{
    ConfigureJsonSerializer = opts =>
    {
        // 添加转换器,传入你要匹配的字段名
        opts.Converters.Add(new MultiFieldIntArrayConverter("value1", "value2", "value3"));
    }
};

var client = new RestClient(clientOptions);
var response = await client.GetAsync<int[]>(request);

这种方式适合复杂场景,但需要写一点转换器代码,不过写完之后就能自动处理反序列化了。


内容的提问来源于stack exchange,提问作者berto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:05:56