代码之家  ›  专栏  ›  技术社区  ›  user584018

为什么asp.netweb api 2和asp.net核心3.1 web api

  •  0
  • user584018  · 技术社区  · 4 年前

    我将下面的数据发布到2个不同的api端点,其中一个我们在ASP.NETWeb API 2应用程序和其他应用程序ASP.NET核心3.1 Web API应用程序。

    var data = new Data
                {
                    Key = "k1",
                    Value = 80
                };
    
    IClient httpClient = new FluentClient("http://localhost:46551/");
    var x = httpClient.PostAsync("weatherforecast", data).GetAwaiter().GetResult();
    

    Value object 这是我的硬性要求,我不能接受实际的类型。

    public class Data
    {
        public string Key { get; set; }
        public object Value { get; set; }
    }
    

    当我将数据过帐到ASP.NETWeb API 2(使用.Net 4.6.1),VS调试器仅正确显示值,而不显示任何其他负载:

    enter image description here

    但是为了ASP.NETCore3.1WebAPI,VS调试器显示如下,完全不同的表示方式 ValueKind :

    enter image description here

    我有个写作的要求 data

    { "Key":"k1", "Value":80 }
    

    当我试图序列化 数据 对于ASP.NETCore 3.1 Web API,我得到以下输出:

    var ser = JsonConvert.SerializeObject(data);
    
    { "Key":"k1", "Value": {"ValueKind":4} }
    

    对于ASP.NETwebapi2应用程序,虽然我得到了预期的输出。

    问题,如何得到这个输出 { "Key":"k1", "Value":80 } 从ASP.NET核心3.1应用程序以及为什么这两个应用程序有不同的行为?

    谢谢,

    2 回复  |  直到 4 年前
        1
  •  1
  •   iHazCode    4 年前

    你以前用过Newtonsoft吗?netcore3x现在包含的JSON格式化程序是默认的,除非您显式地包含另一个解析器,如NewtonSoft。new/default解析器的行为与Newtonsoft有许多不同之处,但是在迁移时,让我的团队最痛苦的是System.Text.Json文件解析器在识别JSON时不做假设。

    尝试在IoC/Startup中注入Newtonsoft作为解析器,看看这是否会改变行为。

    有关新解析器的一些差异的详细信息: https://docs.microsoft.com/en-us/dotnet/core/compatibility/aspnetcore#authentication-newtonsoftjson-types-replaced

    自定义格式化程序: https://code-maze.com/content-negotiation-dotnet-core/

    总之,我认为不做任何假设的解析器是好的,而且可能是一件好事。然而,在我的例子中,我们根本没有准备好做出所有必要的更正来抵消这种变化。因此,现在,我们还是坚持老的Newtonsoft。

        2
  •  0
  •   FrankJames    4 年前

    在asp.net核心3.1值指向Json令牌。我想这是最好的解释。 https://github.com/dotnet/runtime/issues/31408

    这是另一种解释 How to serialize a dynamic object to a JSON string in dotnet core?

    推荐文章