WebAPI响应结果中的JsonConvert.DeserializeObject问题 - C#

时间:2017-06-13 07:59:21

标签: c# json asp.net-web-api asp.net-web-api2 json-deserialization

我有一个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>

类型的JSON字符串

考虑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);

它的工作。我不知道我错过了什么。

2 个答案:

答案 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; }
}