将格式为“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,但两者都需要不同的格式

将格式为“property=whatever&property2=whatever”的字符串反序列化为对象

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