Сериализация и десериализация словаря <int, int> между службами REST в Web API - PullRequest
0 голосов
/ 08 января 2019

У меня есть метод действия 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 для разбора ответа в ассоциативный массив (в основном словарь), у меня нет проблем.

...