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

时间:2019-09-24 03:30:44

标签: 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);
}

我搜索了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)

PS:我已经尝试将其用于其他类型,并且对于集合类型也得到了一些类似的异常消息。这样,我搜索了Google,发现了this open issue on .NET Core's GitHub。似乎System.Text.JSon当前不完全支持集合类型,一种解决方法是仅使用旧的Newtonsoft Json。

3 个答案:

答案 0 :(得分:13)

Migrate from ASP.NET Core 2.2 to 3.0

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

答案 1 :(得分:7)

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

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

services.AddControllersWithViews().AddNewtonsoftJson();

引用this link

答案 2 :(得分:1)

@sabiland的答案对我有帮助,小的变化

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

    Startup.cs中的
  1. adde,位于ConfigureConfigs方法中, AddMvcCore

    services.AddMvcCore()
            .AddNewtonsoftJson();