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

使用Swagger时JsonConvert.DeserializeObject反序列化异常求助

问题拆解与解决方案

你遇到的这个Unexpected character encountered while parsing value: {反序列化异常,核心原因非常明确:你期望把JSON字符串反序列化为List<string>,但实际传入的JSON是一个包含code字段的对象数组。

看你提供的JSON内容:

[ { "code": "AAA111" }, { "code": "BBB222" }, { "code": "CCC333" }, { "code": "DDD444" } ]

这里的每个数组元素都是一个对象,不是单纯的字符串,而JsonConvert.DeserializeObject尝试把{解析成字符串的一部分时,自然会抛出异常。结合你提到的Descriptor.ParameterType为List<string>,显然是后端接收类型和Swagger传入的JSON结构不匹配了。

下面给你几个可行的解决思路:

1. 定义匹配JSON结构的实体类(最推荐)

这是最规范的做法,先创建一个对应数组元素的实体类:

public class MaterialItem
{
    public string code { get; set; }
}

然后把反序列化的目标类型改成List<MaterialItem>:

List<MaterialItem> value = JsonConvert.DeserializeObject<List<MaterialItem>>(stringValue, serializerSetting);

如果最终需要的是List<string>类型的code列表,只需要在反序列化后做个简单转换:

List<string> codeList = value.Select(item => item.code).ToList();

2. 使用自定义JSON转换器适配类型

如果因为某些限制,你必须把这个对象数组反序列化成List<string>,可以写一个自定义转换器来处理:

public class CodeToStringConverter : JsonConverter<List<string>>
{
    public override List<string> ReadJson(JsonReader reader, Type objectType, List<string> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 先把JSON反序列化为对象列表
        var materialItems = serializer.Deserialize<List<MaterialItem>>(reader);
        // 提取所有code字段转为字符串列表
        return materialItems?.Select(item => item.code).ToList() ?? new List<string>();
    }

    public override void WriteJson(JsonWriter writer, List<string> value, JsonSerializer serializer)
    {
        // 如果需要把字符串列表序列化回对象数组,在这里实现
        var materialItems = value.Select(code => new MaterialItem { code = code }).ToList();
        serializer.Serialize(writer, materialItems);
    }
}

然后在序列化配置中添加这个转换器,再执行反序列化:

serializerSetting.Converters.Add(new CodeToStringConverter());
List<string> value = JsonConvert.DeserializeObject<List<string>>(stringValue, serializerSetting);

3. 检查并修正Swagger接口定义

还有一种可能是Swagger的接口参数定义出错了——你传入的mat字段是对象数组,但Swagger文档里可能把它错误定义成了string[](字符串数组),导致后端生成的Descriptor.ParameterType变成了List<string>。如果可以修改Swagger文档,把mat的类型修正为包含code字段的对象数组,后端的参数类型也会自动匹配,从根源解决问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:32:40