如何用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
相关产品推荐
相关产品推荐

