从 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×tamp=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),所以唯一的方法是在“&”上拆分字符串,然后拆分每个 name/value 对在“=”上并将其映射到您的 class 属性。
在控制器中你可以直接使用你的类型
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×tamp=1383609498.44";
var sampleApi = Deserialize<SampleApi>(response);
此代码是来自 api 的示例响应正文。
message_type=incoming&mobile_number=639181234567&shortcode=29290123456&request_id=5048303030534D415254303030303032393230303032303030303030303133323030303036333933393932333934303030303030313331313035303735383137&message=This+is+a+test+message×tamp=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),所以唯一的方法是在“&”上拆分字符串,然后拆分每个 name/value 对在“=”上并将其映射到您的 class 属性。
在控制器中你可以直接使用你的类型
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×tamp=1383609498.44";
var sampleApi = Deserialize<SampleApi>(response);