RestSharp反序列化List <object>返回无法转换或从System.String转换为

时间:2019-02-08 09:01:35

标签: c# json c#-4.0 deserialization restsharp

我知道有很多与此相关的主题,悬停,在这里我找不到解决方案或弄清楚我在做什么错。

场景:

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 

在过去的两天里,我尝试了在互联网上找到的多种解决方案。

有人可以告诉我我在这里想念的吗?

谢谢。

请让我知道是否要添加更多详细信息。

用于序列化和反序列化的类:

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

Api创建响应:

//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 :(得分:2)

现在要详细说明评论,我想我已经证明了这一理论...

您可以在this fiddle中看到,如上所述,JSON的反序列化工作正常。

这里似乎正在发生的事情是response.Content是JSON,但已转义。您使用的任何服务器框架都可能再次将结果(string)序列化了。

您可以从this fiddle中看到,它会重现相同的错误。

至少要替换该行:

return JsonConvert.SerializeObject(apiResponse);

只需

return apiResponse;

应该导致正确的序列化(如果您需要进一步配置而不是查看相关文档,则框架将执行序列化。

但是,我还从the docs中注意到,RestSharp内置了自己的JSON反序列化,因此在接收端也可能不需要使用Newtonsoft.Json。您可以在recommended usages中看到各种类似的通用重载,例如Execute<T>,它们允许您指定返回类型,框架将对此反序列化。

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

我建议阅读RestSharp文档和一些示例。

答案 1 :(得分:1)

我认为问题在于反序列化部分中的IList。

尝试:

BEGIN TRANSACTION;
    CREATE TABLE TABLEA (COLUMN_A VARCHAR2(30));
    CREATE TABLE TABLEB (COLUMN_B VARCHAR2(30));
    CREATE TABLE MAPPING_TABLE (TABLEA_COL VARCHAR2(30), TABLEB_COL VARCHAR2(30));
    INSERT INTO MAPPING_TABLE (TABLEA_COL, TABLEB_COL) VALUES ('COLUMN_A', 'COLUMN_B');
COMMIT;