.NET Core Newtonsoft 无属性名JSON反序列化映射报错如何处理
问题原因
- 类型拼写错误:
Data类中positions属性的类型声明为Position,但你实际定义的对应类名为Positions,拼写差异首先会导致类型匹配失败。 [JsonArray]特性使用错误:为Positions类添加[JsonArray]特性后,Newtonsoft.Json会将该类识别为数组类型,要求其实现集合相关接口才能完成数组反序列化填充,但你定义的Positions是普通实体类,内部仅包含数组成员,不满足集合类的要求,因此直接抛出无法创建填充列表类型的异常。- 结构不匹配:从接口返回的结构来看,
positions节点本身就是字符串数组,你额外封装的自定义类没有对应匹配的JSON结构,也会导致反序列化失败。
解决方案
方案1:直接映射数组(推荐,代码最简)
如果不需要额外封装Positions类,直接将属性定义为字符串数组即可:
public class Data { // 直接用字符串数组对应JSON中的positions数组 public string[] positions { get; set; } }
无需额外配置,直接反序列化即可正常解析。
方案2:保留自定义Positions类
如果业务需要保留Positions封装类,删除[JsonArray]特性,新增自定义JsonConverter完成数组到自定义类的映射:
public class Data { public Positions positions { get; set; } } // 移除[JsonArray]特性,添加转换器绑定 [JsonConverter(typeof(PositionsConverter))] public class Positions { public string[] value { get; set; } } // 自定义转换器实现数组和Positions类的互相转换 public class PositionsConverter : JsonConverter<Positions> { public override Positions ReadJson(JsonReader reader, Type objectType, Positions existingValue, bool hasExistingValue, JsonSerializer serializer) { // 先把当前节点反序列化为字符串数组 var stringArray = serializer.Deserialize<string[]>(reader); return new Positions { value = stringArray }; } public override void WriteJson(JsonWriter writer, Positions value, JsonSerializer serializer) { // 序列化时直接输出value数组 serializer.Serialize(writer, value.value); } }
配置完成后即可正常完成反序列化。
内容的提问来源于stack exchange,提问作者user3024888
相关产品推荐
相关产品推荐

