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

RestSharp单元素JSON数组被解析为对象的解决办法咨询

解决RestSharp 106.x单元素数组被解析为对象的问题

由于RestSharp 106.x版本默认依赖Newtonsoft.Json做反序列化,你可以通过自定义反序列化配置或转换器,强制将JSON中的单元素对象转为数组,无需修改响应类定义。以下是具体实现方案:

方案1:自定义JsonDeserializer并配置序列化规则

创建继承自RestSharp默认JsonDeserializer的自定义反序列化器,修改Newtonsoft.Json的序列化设置,自动处理单元素数组场景:

using RestSharp.Deserializers;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Collections.Generic;

public class SingleElementArrayJsonDeserializer : JsonDeserializer
{
    public SingleElementArrayJsonDeserializer()
    {
        Settings = new JsonSerializerSettings
        {
            // 启用自动数组处理,支持单元素对象与数组的双向转换
            ArrayHandling = ArrayHandling.Auto,
            // 添加自定义转换器保障反序列化时的单对象转数组逻辑
            Converters = new List<JsonConverter> { new SingleElementToArrayConverter() }
        };
    }
}

方案2:编写专用Json转换器

实现自定义转换器,当目标类型为数组但JSON是单个对象时,自动将其包装为单元素数组:

using Newtonsoft.Json;
using System;

public class SingleElementToArrayConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // 仅处理数组类型的目标字段
        return objectType.IsArray;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 若JSON令牌是对象而非数组,反序列化为单个元素后包装成数组
        if (reader.TokenType == JsonToken.StartObject)
        {
            var elementType = objectType.GetElementType();
            var singleItem = serializer.Deserialize(reader, elementType);
            var array = Array.CreateInstance(elementType, 1);
            array.SetValue(singleItem, 0);
            return array;
        }

        // 正常数组按默认逻辑反序列化
        return serializer.Deserialize(reader, objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 仅处理反序列化,序列化逻辑无需实现
        throw new NotImplementedException();
    }
}

应用自定义反序列化器

初始化RestClient时,将自定义反序列化器绑定到JSON类型响应:

var client = new RestClient("你的API基础地址");
// 替换默认JSON反序列化器
client.AddHandler("application/json", new SingleElementArrayJsonDeserializer());

// 发送请求并反序列化
var request = new RestRequest("接口路径", Method.GET);
var response = client.Execute<你的响应类>(request);
var result = response.Data;

配置完成后,无论API返回的Alert字段是单元素还是多元素数组,RestSharp都会正确解析为数组类型,无需修改响应类定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:34:59