将格式为“property=whatever&property2=whatever”的字符串反序列化为对象
本文关键字:whatever 字符串 对象 反序列化 property2 格式 property amp | 更新日期: 2023-09-27 18:36:49
我正在获取一个HttpRequest并将其读取为字符串
var body = request.Content.ReadAsStringAsync().Result;
此正文为我提供了一个如下所示的字符串:
"To=Jim&From=Dan+Bailey"
我想序列化 body 以异步方式绑定到看起来像
public class Letter
{
[JsonProperty("To")]
public string To { get; set; }
[JsonProperty("From")]
public string From { get; set; }
}
有什么想法吗? 我尝试使用JsonSerializer和Newtonsoft.Json.Convert,但两者都需要不同的格式
Json 反序列化程序仅适用于 Json 字符串
您可以使用实用程序 ParseQueryString 直接将查询字符串转换为 NameValueCollection
var body = request.Content.ReadAsStringAsync().Result;
var parameters = HttpUtility.ParseQueryString(body);
在大多数情况下,使用 NameValueCollection 就足够了,但如果您仍然需要一个强类型对象,我建议使用反射,或者首先序列化为 json 字符串,然后使用 Newtonsoft 反序列化程序
var dict = new Dictionary<string, string>();
foreach (var key in parameters.Keys)
{
dict.Add(key, parameters[key]);
}
var json = JsonConvert.SerializeObject(dict);
var obj = JsonConvert.DeserializeObject<Letter>(json);
你拥有的不是JSON,而很可能是一个简单的html参数字符串。根据您的类Letter
的外观,看起来格式是固定的。
我想你可以用正则表达式来做:
var match = Regex.Match("To=Jim&From=Dan+Bailey", "To=(?<To>[^&]+)&From=(?<From>[^&]+)");
var letter = new Letter() { To = match.Groups["To"].Value, From = match.Groups["From"].Value };