I have made a .NET Core Web API project to test it out.
My problem is, that the API returns an empty JSON object, when I request the endpoint, which is located at “/api/cars/123” for instance. This happens no matter what kind of object I put in, unless it’s any primitive datatype, or an array thereof. The response is always:
{}
The configuration of the application is completely default, on a fresh Visual Studio 2017 installation.
I have the following classes:
Car.cs
namespace Ex6.Entities
{
public class Car
{
private int Id { get; set; }
private string Make { get; set; }
private string Model { get; set; }
public Car(int Id, string Make, string Model)
{
this.Id = Id;
this.Make = Make;
this.Model = Model;
}
}
}
CarsController.cs:
using Microsoft.AspNetCore.Mvc;
using Ex6.Entities;
namespace Ex6.Controllers
{
[Route("api/[controller]")]
public class CarsController : Controller
{
[HttpGet("{id}")]
public JsonResult GetCar(int id)
{
return Json(new Car(1, "Toyota", "Aygo" ));
}
}
}
Am I missing something?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
In order for the JsonSerializer to be able to see and serialize your properties, they need to be public:
public int Id { get; private set; } //the setters can be private
public string Make { get; set; }
public string Model { get; set; }
Method 2
Try this by adding configure
services.AddControllersWithViews().AddNewtonsoftJson();
….AddNewtonsoftJson() this should solve the issue.
Method 3
For some reason, Text.JSON doesn’t serialize public fields as well, so they need to be properties. This solved the similar issue for me
Method 4
Try to define your entity like this:
namespace Ex6.Entities
{
public class Car
{
public int Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public Car(int _Id, string _Make, string _Model)
{
Id = _Id;
Make = _Make;
Model = _Model;
}
}
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0