Почему asp. net ядро ​​отправляет пустой объект в качестве ответа? - PullRequest
1 голос
/ 13 января 2020

Когда я отлаживаю код в 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));
}

Ответ, который я получаю: Reponse Result

Необходимый ответ:

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

Я уже пробовал это: Fre sh ASP. NET Core API возвращает пустые JSON объекты

Ответы [ 2 ]

2 голосов
/ 13 января 2020

На основании того факта, что все ваше действие - это возврат Cities, который, по-видимому, является свойством или полем, определенным на вашем контроллере, я собираюсь сделать снимок в темноте и предположить, что вы устанавливаете это в еще один запрос и ожидается, что он все еще будет в этом запросе. Это не так, как это работает. Контроллер создается и удаляется с каждым запросом, поэтому все, что ему было задано в течение срока действия запроса, не сохранится. В результате Cities не имеет ничего в этом запросе, поэтому вы получите пустой ответ.

Если вам нужен список городов в действии, то вам нужно запросить эти в этом действии . Кроме того, что стоит, System.Text. Json в настоящее время не поддерживает сериализацию полей, как другие упоминали в комментариях, но вы все равно можете использовать JSON. NET вместо этого, что и происходит. См .: https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio#jsonnet -поддержка

1 голос
/ 15 января 2020

System.Text.Json в настоящее время не поддерживает сериализацию / десериализацию полей и конструкторов без параметров, не по умолчанию.

В вашем примере модели используются поля и конструктор не по умолчанию . Если вам по какой-то причине нужно использовать собственный конструктор, вам потребуется реализовать собственный JsonConverter<T> для поддержки этого. Это может быть полезно для c: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to#deserialize -to-immutable-classes-structs

Только publi c properties с публикацией c получатели / установщики поддерживаются вместе с конструктором по умолчанию, без параметров (что называется Plain_old_CLR_object (POCO) ). Примечание: Если вы только сериализуете (то есть пишете), обычно сеттеры не должны публиковаться c.

Свойства отличаются от полей (и содержат геттеры / сеттеры)

Вот исправление:

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