.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 结果,而不是像这样的梨形结果。
- 为什么我需要添加 JsonObject 属性?我在任何其他示例中都没有看到它。
- 奇怪的格式是怎么回事。我也找不到任何参考...
通常,您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);
}
这是一个简单的 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 结果,而不是像这样的梨形结果。
- 为什么我需要添加 JsonObject 属性?我在任何其他示例中都没有看到它。
- 奇怪的格式是怎么回事。我也找不到任何参考...
通常,您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);
}