我知道有很多与此相关的主题,悬停,在这里我找不到解决方案或弄清楚我在做什么错。
场景:
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.]
答案 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;