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

Deserializing string of format "property=whatever&property2=whatever" to an object

我正在获取一个 HttpRequest 并将其读取为一个字符串

var body = request.Content.ReadAsStringAsync().Result;

这个正文给我一个如下所示的字符串:

"To=Jim&From=Dan+Bailey"

我想序列化正文以自动绑定到看起来像

的对象
public class Letter
{
    [JsonProperty("To")]
    public string To { get; set; }

    [JsonProperty("From")]
    public string From { get; set; }
}

有什么想法吗?我尝试使用 JsonSerializer 和 Newtonsoft.Json.Convert 但两者都需要不同的格式

您拥有的不是 JSON,而很可能是一个简单的 html 参数字符串。考虑到您的 class Letter 的样子,格式似乎是固定的。

我想你可以用 Regex 来做:

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

Json 反序列化器仅适用于 Json 字符串

您可以直接使用实用程序将查询字符串转换为 NameValueCollection ParseQueryString

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