.NET Core Web API 序列化问题

.NET Core Web API serialization issue

这是一个简单的 API 控制器的摘录:

[Route("api/cities")]
public class CitiesController : BaseController
{
    internal protected ICityRepository _cityRepository;
    public CitiesController(ICityRepository cityRepository) : base()
    {
        _cityRepository = cityRepository;
    }

    // GET: api/Cities
    [HttpGet]
    public IEnumerable<City> Get()
    {
        var cities = _cityRepository.GetAll();
        return cities;
    }

    // GET: api/Cities/5
    [HttpGet("{id}", Name = "GetCity")]
    public IActionResult Get(Guid id)
    {
        City city = _cityRepository.Get(id);
        if (city == null)
        {
            return NotFound();
        }

        return new ObjectResult(city);
    }

BaseController 目前只是继承自Controller。每当我调用 api/cities 或 api/cities/E4477C67-894E-492C-95DE-001DC73730A1 时,我都会在 return:

中得到类似的信息
{
    "$id": "2828",
    "$values": [
    {
        "$id": "2829"
    },
    {
        "$id": "2830"
    },
    {
        "$id": "2831"
    },
    ...

{
    "$id": "2827"
}

分别。看起来它正在 returning 序列化对象的序列号或其他东西。经过一番谷歌搜索 我遇到了 JsonObject 属性,通过将其添加到我的基 class,使对象以某种方式序列化。注意“某种时尚”。

基本获取的响应看起来有点像这样:

{
"$id": "2",
"$values": [
    {
        "$id": "3",
        "name": "Beigem",
        "zipCode": "1852",
        "id": "e4477c67-894e-492c-95de-001dc73730a1",
        "concurrencyStamp": "AAAAAAAAZxE=",
        "created": "2017-11-06T08:22:19.9733333",
        "createdBy": null,
        "modified": "2017-11-06T08:22:19.9733333",
        "modifiedBy": null,
        "isNew": false,
        "__Key": "e4477c67-894e-492c-95de-001dc73730a1"
    },
    ...

仍然是 $id 和 $values 的东西。我不想要那个。我希望它是一个干净的 json 结果,而不是像这样的梨形结果。

  1. 为什么我需要添加 JsonObject 属性?我在任何其他示例中都没有看到它。
  2. 奇怪的格式是怎么回事。我也找不到任何参考...

通常,您should not 序列化 EF 实体。

考虑为您的控制器定义数据协定,并且 return 仅定义 API 调用设计所需的数据。通过这种方法,您将从存储库中获取 EF 实体并将相关字段复制到输出数据对象:

// GET: api/Cities/5
[HttpGet("{id}", Name = "GetCity")]
public IActionResult Get(Guid id)
{
    City city = _cityRepository.Get(id);
    if (city == null)
    {
        return NotFound();
    }

    CityData cityData = new CityData
    {
        Name = city.Name,
        ...
    };

    return Json(cityData);
}