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

Tom*_*len 26 c# asp.net postdata query-string

使用以下代码:

string q = "userID=16555&gameID=60&score=4542.122&time=343114";
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ain 68

非常简单...使用HttpUtility.ParseQueryString方法.

未经测试,但这应该工作:

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.
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!看起来不错,但我在解码他们在 MSDN 页面上提供的可怕示例时遇到了麻烦,一旦我有 `var q = HttpUtility.ParseQueryString("?userID=16555&gameID=60&score=4542.122&time=343114");` 我该怎么做检索特定值? (2认同)

Adi*_*dil 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"];
Run Code Online (Sandbox Code Playgroud)

编辑

如果您可以使用HttpUtility.ParseQueryString那么这将是一个很多更直接和它不会是区分大小写如在LINQ的情况.

  • 当你有一个像'a = 1&a = 2&a = 3`的查询字符串时会发生什么?这是有效的,因为`a = 1; a = 2; a = 3`.使用`HttpUtility.ParseQueryString`.它处理这些和其他奇怪的事情. (5认同)
  • 如果您需要解析System.Web上下文之外的查询字符串,这是一个很好的解决方案. (2认同)

erd*_*mke 6

如前面的每个答案中所述,如果您处于可以向System.Web库添加依赖项的上下文中,则使用HttpUtility.ParseQueryString是有意义的。(作为参考,相关的源可以在Microsoft参考源中找到)。但是,如果这不可能,我想对Adil的答案提出以下修改,以解决注释中涉及的许多问题(例如区分大小写和重复的键):

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();
Run Code Online (Sandbox Code Playgroud)


Ama*_*hez 6

如果你想避免需要使用上的System.Web依赖HttpUtility.ParseQueryString,您可以使用Uri扩展方法ParseQueryString中发现的System.Net.Http

请注意,您必须将响应主体转换为有效主体,Uri这样才能ParseQueryString正常工作。

另请注意,在MSDN文档中,此方法是Uri类的扩展方法,因此您需要引用程序集System.Net.Http.Formatting(位于System.Net.Http.Formatting.dll中)。我尝试通过名称为“ System.Net.Http.Formatting”的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();
Run Code Online (Sandbox Code Playgroud)