解析“查询字符串”格式化数据的最简单方法

时间:2012-08-14 16:41:40

标签: c# asp.net query-string postdata

使用以下代码:

string q = "userID=16555&gameID=60&score=4542.122&time=343114";

解析值的最简单方法是什么,最好不要编写自己的解析器?我正在寻找与Request.querystring["gameID"]具有相同功能的东西。

6 个答案:

答案 0 :(得分:63)

非常简单......使用HttpUtility.ParseQueryString method

未经测试,但这应该有效:

var qs = "userID=16555&gameID=60&score=4542.122&time=343114";
var parsed = HttpUtility.ParseQueryString(qs);
var userId = parsed["userID"]; 
//  ^^^^^^ Should be "16555".  Note this will be a string of course.

答案 1 :(得分:17)

你可以像这样使用linq。

string query = "id=3123123&userId=44423&format=json";

Dictionary<string,string> dicQueryString = 
        query.Split('&')
             .ToDictionary(c => c.Split('=')[0],
                           c => Uri.UnescapeDataString(c.Split('=')[1]));

string userId = dicQueryString["userID"];

修改

如果您可以使用HttpUtility.ParseQueryString那么它将更加直接,并且不会像LinQ那样区分大小写。

答案 2 :(得分:5)

正如前面每个答案中所提到的,如果您处于可以向System.Web库添加依赖项的上下文中,则使用HttpUtility.ParseQueryString是有意义的。 (作为参考,相关来源可以在Microsoft Reference Source中找到)。但是,如果无法做到这一点,我想对Adil's回答提出以下修改,这些修改解释了评论中提到的许多问题(例如区分大小写和重复密钥):

var q = "userID=16555&gameID=60&score=4542.122&time=343114";
var parsed = q.TrimStart('?')
    .Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(k => k.Split('='))
    .Where(k => k.Length == 2)
    .ToLookup(a => a[0], a => Uri.UnescapeDataString(a[1])
      , StringComparer.OrdinalIgnoreCase);
var userId = parsed["userID"].FirstOrDefault();
var time = parsed["TIME"].Select(v => (int?)int.Parse(v)).FirstOrDefault();

答案 3 :(得分:4)

如果您想避免使用HttpUtility.ParseQueryString所需的System.Web依赖,您可以使用Uri中的ParseQueryString扩展方法System.Net.Http。< / p>

请注意,您必须将响应正文转换为有效的Uri,以便ParseQueryString有效。

请注意,在MSDN文档中,此方法是Uri类的扩展方法,因此您需要引用程序集System.Net.Http.Formatting(在System.Net.Http.Formatting.dll中)。我尝试使用名为&#34; System.Net.Http.Formatting&#34;的nuget包安装它,它运行正常。

string body = "value1=randomvalue1&value2=randomValue2";

// "http://localhost/query?" is added to the string "body" in order to create a valid Uri.
string urlBody = "http://localhost/query?" + body;
NameValueCollection coll = new Uri(urlBody).ParseQueryString();

答案 4 :(得分:2)

这怎么样

using System.Text.RegularExpressions;

// query example
//   "name1=value1&name2=value2&name3=value3"
//   "?name1=value1&name2=value2&name3=value3"
private Dictionary<string, string> ParseQuery(string query)
{
    var dic = new Dictionary<string, string>();
    var reg = new Regex("(?:[?&]|^)([^&]+)=([^&]*)");
    var matches = reg.Matches(query);
    foreach (Match match in matches) {
        dic[match.Groups[1].Value] = Uri.UnescapeDataString(match.Groups[2].Value);
    }
    return dic;
}

答案 5 :(得分:1)

System.Net.Http ParseQueryString扩展方法为我工作。我正在使用OData查询选项,并尝试解析出一些自定义参数。

xlWorkBook.saved = true

似乎能给我我需要的东西。