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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:15:03