【问题标题】:JsonConvert.DeserializeObject issue in WebAPI Response result - C#WebAPI 响应结果中的 JsonConvert.DeserializeObject 问题 - C#
【发布时间】:2017-06-14 07:35:56
【问题描述】:

我有一个 Model 类,它在其中一个 WebAPI 中有一个 GENERIC 属性,在通过 HttpGet 调用 WebAPI Controller 方法时,它返回对象,但我无法对响应 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&lt;Celebrity&gt; 类型的 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 控制器方法并且它不是反序列化的。

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

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

【问题讨论】:

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


    【解决方案1】:

    这可能是 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&lt;Celebrity&gt;

    【讨论】:

    • 我仍然遇到同样的问题。
    • @Mastero 你有异常还是没有反序列化?
    • 没有。我没有得到任何异常我得到了模型的默认实例,没有分配任何内容。
    • @Mastero 看看我的编辑是否适合你,我认为应该
    • @Mastero 好,请通知我结果,以便我进一步帮助您
    【解决方案2】:

    如果您还没有找到解决方案,这可能会对您有所帮助。您可以尝试将属性、“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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多