Skip to main content
 首页 » 编程设计

c#之从 web api 反序列化响应主体

2024年06月03日38落叶无声

此代码是来自 api 的示例响应正文。

message_type=incoming&mobile_number=639181234567&shortcode=29290123456&request_id=5048303030534D415254303030303032393230303032303030303030303133323030303036333933393932333934303030303030313331313035303735383137&message=This+is+a+test+message&timestamp=1383609498.44 

有没有办法将响应主体放置到像这样的实体的属性中? 或者反序列化响应体之类的东西?

public class SampleApi 
{ 
    public string MessageId { get; set; } 
 
    public string MessageType { get; set; } 
 
    public string MobileNumber { get; set; } 
 
    public string Message { get; set; } 
 
    public string ShortCode { get; set; } 
 
    public string ClientId { get; set; } 
 
    public string SecretKey { get; set; } 
 
    //Start From Reply Api 
 
    public string RequestId { get; set; } 
}    

请您参考如下方法:

你可以为它写一个自定义反序列化器

public T Deserialize<T>(string resp) where T : new() 
{ 
    var nameValuePairs = HttpUtility.ParseQueryString(resp); 
    var obj = new T(); 
    var props = obj.GetType().GetProperties() 
                   .ToDictionary(p => p.Name.Replace("_","") , p => p, StringComparer.InvariantCultureIgnoreCase); 
    foreach(var key in nameValuePairs.AllKeys) 
    { 
        var newkey = key.Replace("_", ""); 
        if (props.ContainsKey(newkey)) 
            props[newkey].SetValue(obj, Convert.ChangeType(nameValuePairs[key], props[newkey].PropertyType)); 
    } 
    return obj; 
} 

并用作

string response = "message_type=incoming&mobile_number=639181234567&shortcode=29290123456&request_id=5048303030534D415254303030303032393230303032303030303030303133323030303036333933393932333934303030303030313331313035303735383137&message=This+is+a+test+message&timestamp=1383609498.44"; 
var sampleApi = Deserialize<SampleApi>(response);