Cuando depuro el código en VS, la lista de ciudades, que estoy devolviendo, tiene 3 objetos junto con las propiedades. Cuando llamo a este punto final, recibo una respuesta de 3 elementos de lista de objetos vacíos.
Cómo resolver este problema?
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); }Así es como estoy llamando al punto final
getCities() { this.http.get<City[]>('/api/wizard/cities') .subscribe(result => { console.log(result); this.cities = result; }, error => console.error('Something went wrong : ' + error)); }La respuesta que se necesita:
[ { "SearchCity": "Toronto", "AssociatedCities": "Ajax, Whitby, Toronto, Mississauga, Brampton", "Province": "ON", "Status": 1 }, { "SearchCity": "Vancouver", "AssociatedCities": "Vancouver, Vancouver City", "Province": "BC", "Status": 1 } ]Ya probé esto: Fresh ASP.NET Core API devuelve objetos JSON vacíos
System.Text.Json actualmente no admite la serialización o deserialización de campos y constructores no predeterminados y sin parámetros.
Su modelo de ejemplo usa ambos campos y un constructor no predeterminado . Si necesita usar un constructor personalizado por algún motivo, deberá implementar su propio JsonConverter<T> para admitirlo. Este documento podría ser útil para eso: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to#deserialize-to-immutable- clases y estructuras
Solo se admiten propiedades públicas con getters/setters públicos junto con el constructor predeterminado sin parámetros (lo que se conoce como Plain_old_CLR_object (POCO) ). Nota: si solo está serializando (es decir, escribiendo), los configuradores generalmente no tienen que ser públicos.
Las propiedades son diferentes de los campos (y contienen captadores/establecedores).
Aquí está la solución:
public class City { public string CityName { get; set; } public string AssociatedCities { get; set; } public string Province { get; set; } public int Status { get; set; } }En mi caso, acabo de agregar esto en mi método ConfigureServices en Startup.cs (estoy usando Dot Net 5.0)
services.AddControllers().AddNewtonsoftJson();Basado en el hecho de que todo lo que hace su acción es devolver Cities , que presumiblemente es una propiedad o un campo definido en su controlador, voy a tomar una foto en la oscuridad y asumir que está configurando eso en otra solicitud y esperándolo. estar todavía allí en esta petición. Así no es cómo funciona. El controlador se crea una instancia y se elimina con cada solicitud, por lo que cualquier cosa que se establezca durante la vigencia de una solicitud no sobrevivirá. Como resultado, Cities no tiene nada en esta solicitud, por lo que obtiene una respuesta vacía.
Si necesita una lista de ciudades en la acción, debe consultarlas en esa acción . Además, por lo que vale, System.Text.Json actualmente no admite la serialización de campos, como otros han mencionado en los comentarios, pero aún puede usar JSON.NET en su lugar, que sí lo hace. Consulte: https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio#jsonnet-support