【问题标题】:Why asp.net core sending empty object as response?为什么 asp.net 核心发送空对象作为响应?
【发布时间】:2020-04-30 01:41:07
【问题描述】:

当我在 VS 中调试代码时,我返回的城市列表中包含 3 个对象以及属性。当我调用此端点时,我收到 3 个空对象列表项的响应。

如何解决这个问题?

模型类:

public class City
{
    public string CityName;
    public string AssociatedCities; 
    public string Province;
    public int Status;

    public City(string cityName, string associatedCities, string province, int status)
    {
        this.CityName = cityName;
        this.AssociatedCities = associatedCities;
        this.Province = province;
        this.Status = status;
    }
}

端点:

[HttpGet]
[Route("cities")]
public ActionResult<IEnumerable<City>> GetCities()
{
    return Ok(Cities);
}

这就是我调用端点的方式

getCities() {
  this.http.get<City[]>('/api/wizard/cities')
  .subscribe(result => {
    console.log(result);
    this.cities = result;
  }, error => console.error('Something went wrong : ' + error));
}

我得到的回应:

需要的响应:

[
  {
    "SearchCity": "Toronto",
    "AssociatedCities": "Ajax, Whitby, Toronto, Mississauga, Brampton",
    "Province": "ON",
    "Status": 1
  },
  {
    "SearchCity": "Vancouver",
    "AssociatedCities": "Vancouver, Vancouver City",
    "Province": "BC",
    "Status": 1
  }
]

我已经尝试过了:Fresh ASP.NET Core API returns empty JSON objects

【问题讨论】:

  • 请添加您对Cities的定义。
  • 你有public City()构造函数吗?请添加默认构造函数并再试一次public City() {}
  • 谢谢,马上更新。
  • JSON 序列化程序不支持 fields - 使用 properties。即public string CityName { get; set; }
  • 感谢@KirkLarkin 为我工作。新手在这里'为什么会犯错误。再次感谢。

标签: c# angular asp.net-core asp.net-core-webapi


【解决方案1】:

System.Text.Json 目前不支持字段和非无参数、非默认构造函数的序列化/反序列化。

您的示例模型同时使用了字段非默认构造函数。如果出于某种原因需要使用自定义构造函数,则需要实现自己的 JsonConverter&lt;T&gt; 来支持它。该文档可能对此有所帮助: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to#deserialize-to-immutable-classes-and-structs

仅支持具有公共 getter/setter 的 公共属性 以及 默认的无参数构造函数(称为 Plain_old_CLR_object (POCO))。注意:如果您只是序列化(即写入),则 setter 通常不必公开。

Properties 不同于字段(并且包含 getter/setter)。

这里是修复:

public class City
{
    public string CityName { get; set; }
    public string AssociatedCities { get; set; }
    public string Province { get; set; }
    public int Status { get; set; }
}

【讨论】:

    【解决方案2】:

    就我而言,我只是在 Startup.cs 的 ConfigureServices 方法中添加了这个(我使用的是 Dot Net 5.0)

    services.AddControllers().AddNewtonsoftJson();
    

    【讨论】:

    • 它对我有用。我要添加包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
    【解决方案3】:

    基于您所做的所有操作都是返回 Cities 的事实,这可能是您的控制器上定义的属性或字段,我将在黑暗中试一试,并假设您将其设置为另一个请求,并期望它仍然存在于该请求中。这不是它的工作原理。控制器被实例化并随每个请求一起处理,因此在请求的生命周期内设置的任何内容都将无法生存。结果,Cities 在此请求中没有任何内容,因此您得到一个空响应。

    如果您需要行动中的城市列表,那么您应该查询那些该行动中的。此外,就其价值而言,System.Text.Json 目前不支持序列化字段,正如其他人在 cmets 中提到的那样,但您仍然可以使用 JSON.NET 来代替,确实如此。见:https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio#jsonnet-support

    【讨论】:

    • 感谢您的宝贵时间。这些城市都在同样的要求下建立起来。正如@krik Larkin 和你所建议的那样,我只是将字段更改为公共字符串城市名称等属性,公共字符串城市名称 {get; set;} 并且它起作用了。
    猜你喜欢
    • 2022-11-04
    • 2021-02-14
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2017-04-07
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多