作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道有很多关于这个的主题,悬停,我找不到解决方案或弄清楚我在这里做错了什么。
场景:
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/
我是一名优秀的程序员,十分优秀!