我有一个 C# asp.net API,它有一个返回字典的端点
在 swagger 上查看时,响应示例显示为 {}。
我尝试在我的控制器方法上使用以下属性
[SwaggerResponse(System.Net.HttpStatusCode.OK, Type = typeof(List<Door>))] [ProducesResponseType(typeof(List<Door>), 200)]
[ResponseType(typeof(IEnumerable<Country>))]
控制器方法
/// <summary>
/// Retrieves a Dictionary of key-value pairs of Property ids and Property descriptions
/// </summary>
/// <param name="x">Test.</param>
/// <param name="y">Example.</param>
/// <returns>Dictionary of PropertyId, Property Description pairs</returns>
/// <remarks>Excludes Properties that the user is restricted from</remarks>
[Route("Test/{x}/{y}")]
[HttpGet]
public Dictionary<int, string> Test(bool x, bool y)
{
return propertiesService.GetPropertyList(x, y);
}
按照惯例,字典被编码为 JSON 对象,即序列化器(System.Text.Json 或 Newtonsoft Json.NET)将在单个对象中转换字典,例如:
[HttpGet("GetDict")]
public async Task<ActionResult<Dictionary<int, string>>> GetDict()
{
return new Dictionary<int, string>
{
{42, "foo"},
{777, "bar"},
};
}
将导致以下结果:
{"42":"foo","777":"bar"}
由于属性的动态名称,这基本上是无模式的。您需要使用其他一些返回类型。例如,您可以将字典视为
KeyValuePair
s 的集合:
[HttpGet("GetDict")]
public async Task<IEnumerable<KeyValuePair<int, string>>> GetDict()
{
return new Dictionary<int, string>
{
{ 42, "foo" },
{ 777, "bar" },
}.ToArray();
}
结果是:
[{"key":42,"value":"foo"},{"key":777,"value":"bar"}]
这是一个包含 2 个字段(
key
和 value
)的 JSON 对象数组,并且可以有一个模式。