У меня есть метод действия Web API
, который возвращает Dictionary<int, int>
в качестве ответа:
[HttpPost("PostStats")]
public async Task<IActionResult> PostStats([FromBody]StatsBody body)
{
Dictionary<int, int> myDic= new Dictionary<int, int>();
... //Do something with body and myDic
return Ok(myDic);
}
Метод вызывается через HttpClient
:
StatsBody stats = GetStatsBody();
using (var httpClient = new HttpClient { BaseAddress = new Uri(ROOT_ENDPOINT) })
{
// Serializes the content to be sent to the REST service
var content = new StringContent(JsonConvert.SerializeObject(stats), Encoding.UTF8, "application/json");
// Sends the request to the REST service
HttpResponseMessage response = await httpClient.PostAsync(URL, content);
// Gets the response as string
string output = await response.Content.ReadAsStringAsync();
if (response.StatusCode == HttpStatusCode.OK)
{
//Deserialize the response into a a Dictionary<int, int>
myDic = JsonConvert.DeserializeObject<Dictionary<int, int>>(output);
}
else
return BadRequest(output);
}
инструкция myDic = JsonConvert.DeserializeObject<Dictionary<int, int>>(output)
дает исключение, так как не может десериализовать объект.
Newtonsoft.Json.JsonSerializationException: Error converting value "{"0":562,"1":563,"2":564}" to type 'System.Collections.Generic.Dictionary`2[System.Int32,System.Int32]'.
System.ArgumentException: Could not cast or convert from System.String to System.Collections.Generic.Dictionary`2[System.Int32,System.Int32].
Даже если я использую Dictionary<string, int>
или Dictionary<string, dynamic>
, я получаю исключение. Если я проверю переменную output
, ее содержимое будет в следующем формате:
"{\"0\":565,\"1\":566,\"2\":567}"
, который на самом деле не является допустимым форматом JSON. Только я могу получить правильную десериализацию, используя:
string temp = JsonConvert.DeserializeObject<string>(output);
myDic = JsonConvert.DeserializeObject<Dictionary<int, int>>(temp);
Что я делаю не так и как мне получить более четкое решение?
PS:
Если я использую Typescript
клиента, а затем JSON.parse
для разбора ответа в ассоциативный массив (в основном словарь), у меня нет проблем.