我有一个Model类,它在一个WebAPI中有一个GENERIC属性,而在通过HttpGet调用WebAPI Controller方法时,它返回了对象,但是我无法进行DE序列化响应JSON。如果我试图将JSON字符串复制到本地变量(响应的硬编码值),那么它的DE序列化很好,但在动态中它的失败。请查看模型类
通用模型类:
public class Response<T> {
public T Person { get; set; }
public string Mobile { get; set; }
public string Email { get; set; }
}
员工模型类:
public class Employee {
public string EmpId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string OrganizationName { get; set; }
}
public class Celebrity {
public string FirstName { get; set; }
public string LastName { get; set; }
public string Language { get; set; }
}
我有一个Response<Celebrity>
考虑WebAPI控制器方法
public class PersonController : ApiController {
[HttpGet]
public Response<Celebrity> GetPerson() {
return new Response<Celebrity>()
{
Person = new Celebrity()
{
FirstName = "Emma",
LastName = "Watson",
Language = "English"
},
Mobile = "222123456",
Email = "emma@gmail.com"
};
}
}
在控制台应用程序中我调用WebAPI控制器方法而不是DE序列化。
string jsonContent = string.Empty;
var apiResponse = ApiClient.GetAsync("GetPerson").Result;
if (apiResponse.IsSuccessStatusCode) {
jsonContent = apiResponse.Content.ReadAsStringAsync().Result;
Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent);
}
我尝试了以下方法
步骤:#1 我复制了apiResponse.Content.ReadAsStringAsync().Result
{"Result":{"FirstName":"Emma","LastName":"Watson","Language":"English"},"Mobile":"222123456","Email":"emma@gmail.com"}
步骤:#2 我使用了步骤#1的硬编码值
string jsonContent = "{\"Result\":{\"FirstName\":\"Emma\",\"LastName\":\"Watson\",\"Language\":\"English\"},\"Mobile\":\"222123456\",\"Email\":\"emma@gmail.com\"}";
Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent);
它的工作。我不知道我错过了什么。
答案 0 :(得分:0)
API响应的编码可能存在问题。这也可以解释为什么硬编码值有效。
因此,请尝试以下代码,看看它是否有效:
string rawApiResponseString = apiResponse.Content.ReadAsStringAsync().Result;
string jsonContent = Encoding.UTF8.GetString(Encoding.Default.GetBytes(rawApiResponseString));
Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent);
编辑:
尝试使用以下代码:
string jsonContent = apiResponse.Content.ReadAsStringAsync().Result;
Celebrity person = JsonConvert.DeserializeObject<Celebrity>(jsonContent);
JSON string
似乎是序列化Celebrity
而不是Response<Celebrity>
。
答案 1 :(得分:0)
如果您还没有找到解决方案,这可能会对您有所帮助。你可以尝试将属性,“DataContractAttribute”添加到类和“DataMemberAttribute”给所有公共成员并尝试?
两个属性都在命名空间“System.Runtime.Serialization”中,您可以使用“添加引用”并选择“程序集”,“框架”来添加此引用。
基本上你修改过的类看起来应该是这样的
响应类
[DataContract]
public class Response<T> {
[DataMember]
public T Person { get; set; }
[DataMember]
public string Mobile { get; set; }
[DataMember]
public string Email { get; set; }
}
员工模型类
[DataContract]
public class Employee {
[DataMember]
public string EmpId { get; set; }
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public string OrganizationName { get; set; }
}
[DataContract]
public class Celebrity {
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public string Language { get; set; }
}