Skip to main content
 首页 » 编程设计

c#之.NET Core Web API 序列化问题

2024年02月27日2952php

这是一个简单的 API Controller 的摘录:

[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. 奇怪的格式是怎么回事。我也找不到任何引用...

请您参考如下方法:

通常你should not序列化 EF 实体。

考虑为您的 Controller 定义数据契约,并仅返回 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); 
}