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

时间:2015-01-07 18:50:11

标签: c# .net json

我正在接受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,但两者都需要不同的格式

2 个答案:

答案 0 :(得分:3)

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

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

var body = request.Content.ReadAsStringAsync().Result;
var parameters = HttpUtility.ParseQueryString(body);

对于大多数用途,使用NameValueCollection应该足够了,但是如果你仍然需要一个强类型对象,我建议使用反射,或者首先序列化为json字符串,然后使用Newtonsoft deserializer

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

答案 1 :(得分:1)

你拥有的不是JSON,但很可能是一个简单的html参数字符串。根据您的班级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 };