迁移到 .NET Core 3.1 - 缺少 Newtonsoft

Posted

技术标签:

【中文标题】迁移到 .NET Core 3.1 - 缺少 Newtonsoft【英文标题】:Migration to .NET Core 3.1 - Netwonsoft missing 【发布时间】:2020-07-26 23:43:46 【问题描述】:

我刚刚从 2.2 迁移到 ASP.NET Core 3.1,我收到了这个错误:

System.NotSupportedException: The collection type 'System.Collections.Generic.Dictionary`2[System.Object,System.Object]' 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.WriteStackFrame.Initialize(Type type, JsonSerializerOptions options)
   at System.Text.Json.JsonSerializer.WriteAsyncCore(Stream utf8Json, Object value, Type inputType, JsonSerializerOptions options, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
   at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)

但是,我安装了这个包Microsoft.AspNetCore.Mvc.NewtonsoftJson,还在启动中添加了services.AddControllers().AddNewtonsoftJson()

那么为什么仍然忽略 Newtonsoft 而使用 System.Text.Json 呢?

编辑: 代码抛出错误:

public async Task<Dictionary<object, object>> GetTemplatesDictAsync(
           int? from = 0,
            int? take = 100,
            string search = null)
        
            var _templates = await _repository.GetAllAsync(from, take, search, );

            var _dict = _templates.ToDictionary(t => (object)t.id, t => (object)t);

            // also append a property with original list
            _dict.Add("list", _templates);

            return _dict;
        

注意:我将 Dictionary&lt;object, object&gt; 更改为 Dictionary&lt;string, object&gt; 并且代码有效。不过,问题是为什么不使用 Newtonsoft.Json。

EDIT2:

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        
            services.AddAuthentications(Configuration);
            services.AddAutoMapping();
            services.AddMemoryCache();
            services.AddOData();

            // 3.1:
            services.AddControllers()
                        .AddNewtonsoftJson()
                    ;

           // used in 2.2:
           // var mvcCoreBuilder = services.AddMvcCore();
            // mvcCoreBuilder
            //     .AddFormatterMappings()
            //     .AddJsonFormatters()


谢谢

【问题讨论】:

你的 startup.cs 是什么样的? 请参阅Edit2。谢谢 【参考方案1】:

在 .NET Core 3+ 项目中,您有一组不同的调用来替换 MVC。所以你可能会有以下之一:

services.AddControllers().AddNewtonsoftJson();
services.AddControllersWithViews().AddNewtonsoftJson();
services.AddRazorPages().AddNewtonsoftJson();

如果这不起作用,请告诉我们更多您在哪里使用它。

您可以在here 找到更详细的方法。它对我有用。

【讨论】:

我添加了services.AddControllers().AddNewtonsoftJson(); - 我在我的问题中写了它。我只是想知道为什么仍在使用默认序列化程序 请向我们展示引发错误的代码。 确保您的 NewtonsoftJson 软件包已更新为 3.1。还要检查docs.microsoft.com/en-us/aspnet/core/migration/… 还检查我编辑的答案。我能够使用它。

以上是关于迁移到 .NET Core 3.1 - 缺少 Newtonsoft的主要内容,如果未能解决你的问题,请参考以下文章

从 Body 迁移 .NET Core 2.2 到 3.1 集成测试始终为空

将项目从 2.2 更新到 3.1(缺少程序集)或如何在 .NET Core 中使用 API POST 请求时,PostAsJsonAsync()在 .Net Core 3.1 中不起作用 [重复]

从 .NET Core 2.2 迁移到 3.1 后,EF Core 随机抓取 API 请求上的用户表

为啥从 .net core 3.1 迁移到 .net 5 时 JSON 返回值发生了变化

将 Asp.Net Core 2.2 App 迁移到 3.1 时的整数序列化 [关闭]

迁移到 .net core 3.1 后 EF OrderBy 出现问题