RestSharp Deserialize List <object>возвращает Не удалось преобразовать или преобразовать из System.String в - PullRequest
0 голосов
/ 08 февраля 2019

Я знаю, что есть много тем по этому поводу, но я не могу найти решение или выяснить, что я делаю не так здесь.

Сценарий:

There are 2 application ( both using Newtonsoft.Json & RestSharp)

Application A serializes a list of objects and returns a string

Application B takes takes the string deserializes back to the list 

За последние 2 дня я попробовал несколько решений, которые я нашел в интернете ... у меня ничего не работает ..

Может кто-нибудь посоветовать, что мне здесь не хватает?

Спасибо.

Пожалуйста, дайте мне знать, если мне нужно добавить больше деталей.

Класс, используемый для сериализации и десериализации:

public class Email
{
    public string Reference { get; set; }
    public string ShortDescription { get; set; }
}

Api create response:

//Response
List<Email> apiResponse = new List<Email>();
Task<List<Email>> get = getEmails.GetEmails();
apiResponse = (await get);
return JsonConvert.SerializeObject(apiResponse);

Ответ API:

[{"Reference":"01010101","ShortDescription":"Customers Unable To Navigate 
Beyond \"Choose A Level\" Screen on appllicaiton"}, 
{"Reference":"02020202","ShortDescription":"Example2: messenger issue"}]

Десериализация ответа:

        RestClient client = new RestClient("http://servername:81/");
        client.ClearHandlers();
        RestRequest request = new RestRequest("api/emails/HandleGetRequest", Method.GET);
        request.AddHeader("Accept", "application/json");
        request.AddQueryParameter("query", queryString);

        IRestResponse response = client.Execute(request);
        List<Email> apiResponse;

        if (response.StatusCode == HttpStatusCode.OK)
        {
            // OK 
            apiResponse = JsonConvert.DeserializeObject<List<Email>>(response.Content);
        }
        else
        {
            // NOK
            apiResponse = null;
            Console.Write("ERROR: {0}", response.Content);
            log.FatalFormat("ERROR: {0}", response.Content);

        }

        return apiResponse;

Получена ошибка:

[ArgumentException: Could not cast or convert from System.String to 
System.Collections.Generic.List`1[TestProject.Models.Email].]
Newtonsoft.Json.Utilities.ConvertUtils.EnsureTypeAssignable(Object value, 
Type initialType, Type targetType) +243
Newtonsoft.Json.Utilities.ConvertUtils.ConvertOrCast(Object initialValue, 
CultureInfo culture, Type targetType) +123 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType) +485


[JsonSerializationException: Error converting value " 
[{"Reference":"01010101","ShortDescription":"Customers Unable To Navigate 
Beyond \"Choose A Level\" Screen on appllicaiton"}, 
{"Reference":"02020202","ShortDescription":"Example2: messenger issue"}]" 
to type 'System.Collections.Generic.List`1[TestProject.Models.Email]'. Path '', 
line 1, position 6633.]

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Чтобы уточнить комментарий сейчас, я думаю, что я доказал теорию ...

Вы можете видеть в этой скрипке , что десериализация JSON, как описано, работает правильно.

Здесь, похоже, происходит то, что response.Content - это тот JSON, но он сбежал.Скорее всего, используемая вами серверная среда снова сериализировала результат (string).

Из этой скрипки видно, что это воспроизводит ту же ошибку.

По крайней мере, замена строки:

return JsonConvert.SerializeObject(apiResponse);

на просто

return apiResponse;

Должно привести к правильной сериализации (фреймворк сделает это, если вам нужно ее настроитьдальше, чем смотреть на соответствующие документы).

Однако из документов я бы также отметил, что RestSharp имеет собственную встроенную десериализацию JSON, поэтому, вероятно, нет необходимости использовать Newtonsoft.Json на принимающей стороне либо.Вы можете увидеть в рекомендуемых значениях различные универсальные перегрузки, такие как Execute<T>, которые позволяют вам указать тип возвращаемого значения, и среда будет десериализовать это.

IRestResponse<List<Email>> response = client.Execute<List<Email>>(request);
List<Email> apiResponse = response.Data;

Я бы предложилчтение документации RestSharp и некоторых примеров.

0 голосов
/ 08 февраля 2019

Я думаю, что проблема в IList в части десериализации.

Попробуйте:

apiResponse = JsonConvert.DeserializeObject<List<Email>>(response.Content);
...