【问题标题】:.NET Core Web API serialization issue.NET Core Web API 序列化问题
【发布时间】:2018-04-23 09:23:07
【问题描述】:

这是一个简单的 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 时,我都会得到类似的回报:

{
    "$id": "2828",
    "$values": [
    {
        "$id": "2829"
    },
    {
        "$id": "2830"
    },
    {
        "$id": "2831"
    },
    ...

{
    "$id": "2827"
}

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

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

{
"$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. 奇怪的格式是怎么回事。我也找不到任何参考...

【问题讨论】:

标签: c# json .net-core asp.net-core-webapi


【解决方案1】:

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

考虑为您的控制器定义数据协定,并仅返回 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);
}

【讨论】:

  • 好的,在两者之间添加一个视图模型解决了它!然而,原因似乎是别的东西,因为视图模型只是一个对象,正如我的实体应该是的那样。深入研究实体结构,我在我的实体的基类上发现了一个流氓 DataContractAttribute。删除它也会使实体本身正确序列化。当然,应该始终使用视图模型,但这不是解决方案。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 2012-02-19
  • 2023-03-24
  • 1970-01-01
  • 2016-12-11
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多