gpt4 book ai didi

c# - RestSharp Deserialize List 返回 Could not cast or convert from System.String to
转载 作者:行者123 更新时间:2023-11-30 21:30:14 26 4
gpt4 key购买 nike

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

场景:

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 创建响应:

//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.]

最佳答案

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

可以在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 文档和一些示例。

关于c# - RestSharp Deserialize List<object> 返回 Could not cast or convert from System.String to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588921/

26 4 0