'Fresh ASP.NET Core API returns empty JSON objects

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?



Solution 1:[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; }

Solution 2:[2]

Try this by adding configure

services.AddControllersWithViews().AddNewtonsoftJson();

....AddNewtonsoftJson() this should solve the issue.

Solution 3:[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

Solution 4:[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;
        }
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 PavelPerov
Solution 4 Elias Bobadilla