簡體   English   中英

從Web API反序列化響應正文

[英]Deserialize response body from web api

此代碼是來自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; }
}   

這是一種自定義消息格式(不是XML或JSON),因此唯一的方法是在“&”上拆分字符串,然后在“ =”上拆分每個名稱/值對,並將其映射到您的類屬性。

在控制器中,您可以直接使用您的類型

    ActionResult YourApiAction(SampleApi sampleApi)
    {
        var allMapped = sampleApi.MappMessage();
        ....allMapped.MessageType...
    }

但是消息中的名稱必須與您輸入的名稱相同。 message_type->應該為MessageType,依此類推。 然后,魔術直接在您的類型中序列化您的消息。

對於我的評論:

 class SampleApi
 {
    string message_type { get; set; }
    string MessageType { get; private set }

    SampleApi MappMessage()
    {
       MessageType = message_type;
       return this;
    }
 }

您可以為其編寫自定義解串器

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM