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

.NET Core无法反序列化JSON字符串,Newtonsoft可正常解析

问题根因

你遇到的报错是.NET Core默认使用的System.Text.Json序列化器的规则和之前的Newtonsoft.Json不一致导致的:

  • 你的实体类smDesktopSearchResultsVM中indexEventVMs字段定义为List<indexEventVMLite>集合类型
  • 但待反序列化的JSON中,indexEventVMs对应的是单个对象,而非数组包裹的对象集合
  • Newtonsoft.Json默认支持自动将单个对象适配为只有一个元素的集合,System.Text.Json默认没有开启这个适配逻辑,所以触发类型转换错误。
  • Visual Studio可以正常解析JSON,是因为JSON本身格式合法,只是和你定义的实体类字段的类型不匹配,所以序列化器报错。

解决方案

方案1:配置System.Text.Json开启单对象转集合适配(推荐,改动最小)

自定义一个JsonConverter,实现单个对象到对应集合类型的自动转换,注册到序列化配置中即可:

public class SingleOrArrayConverter<T> : JsonConverter<List<T>>
{
    public override List<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.StartArray)
        {
            return JsonSerializer.Deserialize<List<T>>(ref reader, options);
        }
        if (reader.TokenType == JsonTokenType.StartObject)
        {
            var item = JsonSerializer.Deserialize<T>(ref reader, options);
            return new List<T> { item };
        }
        // 兼容null的情况
        if (reader.TokenType == JsonTokenType.Null)
        {
            return null;
        }
        throw new JsonException();
    }

    public override void Write(Utf8JsonWriter writer, List<T> value, JsonSerializerOptions options)
    {
        JsonSerializer.Serialize(writer, value, options);
    }
}

反序列化时将转换器加入配置即可:

var options = new JsonSerializerOptions();
options.Converters.Add(new SingleOrArrayConverter<indexEventVMLite>());
// 可按需增加其他配置,比如属性名大小写不敏感
options.PropertyNameCaseInsensitive = true;

var result = JsonSerializer.Deserialize<smDesktopSearchResultsVM>(jsonStr, options);

方案2:继续使用Newtonsoft.Json(兼容原有逻辑)

如果不想修改适配逻辑,可以在.NET Core项目中继续使用Newtonsoft.Json,避免适配问题:

  1. 安装NuGet包:Newtonsoft.Json
  2. 反序列化直接使用原有写法:
var result = JsonConvert.DeserializeObject<smDesktopSearchResultsVM>(jsonStr);

如果是ASP.NET Core项目,还可以在Program.cs中配置全局使用Newtonsoft.Json:

// .NET 6+ 写法
builder.Services.AddControllers()
    .AddNewtonsoftJson();

方案3:修改实体类定义(如果接口返回结构固定为单个对象)

如果确认接口返回的indexEventVMs永远是单个对象而非集合,可以直接修改实体类的字段类型:

// 把List<indexEventVMLite>改为单个对象类型
public indexEventVMLite indexEventVMs { get; set; }

同时删除构造函数中对应的集合初始化逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:54:03