使用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

