JsonResult(object)导致“不支持集合类型'Newtonsoft.Json.Linq.JToken'。”

Dam*_*les 3 asp.net-core asp.net-core-3.0

我将现有的ASP.NET Core 2.2项目升级到3.0。我有一个返回JSON的方法,该方法在2.2中可用,但是在3.0中,它导致“不支持集合类型'Newtonsoft.Json.Linq.JToken'。” 在返回。

[HttpGet()]
public async Task<JsonResult> Get()
{
    var res = some class object in a third-party library;
    return new JsonResult(res);
}
Run Code Online (Sandbox Code Playgroud)

我搜索了Google,发现Microsoft已将Newtonsoft Json替换为System.Text.Json,但我没有明确使用Newtonsoft Json。在项目的“框架”中,我可以看到Newtonsoft Json,并删除了它和using Newtonsoft.Json.Linq语句,但是结果是相同的。如何不使用Newtonsoft Json?

错误消息是:

System.NotSupportedException: The collection type 'Newtonsoft.Json.Linq.JToken' is not supported.
   at System.Text.Json.JsonClassInfo.GetElementType(Type propertyType, Type parentType, MemberInfo memberInfo, JsonSerializerOptions options)
   at System.Text.Json.JsonClassInfo.CreateProperty(Type declaredPropertyType, Type runtimePropertyType, Type implementedPropertyType, PropertyInfo propertyInfo, Type parentClassType, JsonConverter converter, JsonSerializerOptions options)
   at System.Text.Json.JsonClassInfo.AddProperty(Type propertyType, PropertyInfo propertyInfo, Type classType, JsonSerializerOptions options)
   at System.Text.Json.JsonClassInfo.AddPolicyProperty(Type propertyType, JsonSerializerOptions options)
   at System.Text.Json.JsonClassInfo..ctor(Type type, JsonSerializerOptions options)
   at System.Text.Json.JsonSerializerOptions.GetOrAddClass(Type classType)
   at System.Text.Json.JsonPropertyInfo.get_ElementClassInfo()
   at System.Text.Json.JsonSerializer.HandleObject(JsonPropertyInfo jsonPropertyInfo, JsonSerializerOptions options, Utf8JsonWriter writer, WriteStack& state)
   at System.Text.Json.JsonSerializer.WriteObject(JsonSerializerOptions options, Utf8JsonWriter writer, WriteStack& state)
   at System.Text.Json.JsonSerializer.Write(Utf8JsonWriter writer, Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.JsonSerializer.WriteAsyncCore(Stream utf8Json, Object value, Type inputType, JsonSerializerOptions options, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor.ExecuteAsync(ActionContext context, JsonResult result)
   at Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor.ExecuteAsync(ActionContext context, JsonResult result)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultAsync>g__Logged|21_0(ResourceInvoker invoker, IActionResult result)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Run Code Online (Sandbox Code Playgroud)

PS: I have tried it with other types and got some similar exception messages for collection types. With that, I searched Google and found this open issue on .NET Core's GitHub. It seems like System.Text.JSon currently does not support collection types fully, and a workaround is just use the old Newtonsoft Json.

Ale*_*lex 14

@sabiland 的回答帮助了我,小改动

  1. 在 .csproj 中添加对NewtonsoftJson 的引用,如下所示

< PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" 版本="3.0.0" />

  1. 在 Startup.cs 中添加,在方法 ConfigureServices 中,AddMvcCore

    services.AddMvcCore()
            .AddNewtonsoftJson();
    
    Run Code Online (Sandbox Code Playgroud)


sab*_*and 8

从ASP.NET Core 2.2迁移到3.0

  • 添加对Microsoft.AspNetCore.Mvc.NewtonsoftJson的程序包引用
  • 更新Startup.ConfigureServices以调用AddNewtonsoftJson
  • services.AddMvc()。AddNewtonsoftJson();

  • 非常感谢您提供此信息。我疯狂地寻找这个。最重要的是它有效。 (3认同)

sm1*_*101 8

在基于 .NET Core 3.1 的 Web 应用程序中,如果您遇到此错误,则您需要的 Nuget 包与“Microsoft.AspNetCore.Mvc.NewtonsoftJson”相同。

Startup 类的 ConfigureServices 方法中的代码如下所示

services.AddControllersWithViews().AddNewtonsoftJson();
Run Code Online (Sandbox Code Playgroud)

参考这个链接