【问题标题】:Easiest way to parse "querystring" formatted data解析“查询字符串”格式数据的最简单方法
【发布时间】:2012-08-14 16:41:39
【问题描述】:

使用以下代码:

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

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

【问题讨论】:

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


    【解决方案1】:

    很简单...使用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.
    

    【讨论】:

    • 谢谢!看起来不错,但我无法解码他们在 MSDN 页面上提供的可怕示例,一旦我有 var q = HttpUtility.ParseQueryString("?userID=16555&gameID=60&score=4542.122&time=343114"); 我如何检索特定值?
    • 找不到 System.Net.HttpUtility net Core 1.0 框架
    • 好像他们删除了它。在此处参考答案以获得解决方案:stackoverflow.com/questions/29992848/…
    • Nancy 库还包括 Nancy.Helpers.HttpUtility.ParseQueryString
    • 请注意,ParseQueryString 失败是因为字符串中有超过 1024 个键值对。
    【解决方案2】:

    你可以像这样用 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 那样区分大小写。

    【讨论】:

    • 这适用于这种特定情况,但它不是通用解决方案,因为它不进行百分比解码。
    • 对@Francis Avila,那么它需要在查询中进行更多修改。
    • 如果您需要在 System.Web 上下文之外解析查询字符串,这是一个很好的解决方案。
    • 这会保留大小写,与 ParseQueryString 不同。
    • 当你有一个像a=1&amp;a=2&amp;a=3这样的查询字符串时会发生什么?这是有效的,a=1;a=2;a=3 也是如此。使用HttpUtility.ParseQueryString。它处理这些和其他奇怪的事情。
    【解决方案3】:

    正如前面每个答案中提到的,如果您处于可以向 System.Web 库添加依赖项的上下文中,则使用 HttpUtility.ParseQueryString 是有意义的。 (供参考,相关出处可见Microsoft Reference Source)。但是,如果这不可能,我想对Adil's 答案提出以下修改,这解决了 cmets 中解决的许多问题(例如区分大小写和重复键):

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

    【讨论】:

    • 忽略单项参数,有时也会出现:arg1&amp;arg2&amp;arg3
    【解决方案4】:

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

    请注意,您必须将响应正文转换为有效的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();
    

    【讨论】:

    • 不确定这是否有效...当我尝试此操作时,Uri 没有附加 ParseQueryString 方法,我的代码:var collection = new System.Uri(url).ParseQueryString();
    • @TrevorHart 您确定要添加对 System.Net.Http 的引用并添加 System.Net.Http 命名空间吗?
    • 我做到了,我最终只是编写了自己的解析器。
    【解决方案5】:

    这是怎么回事

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

    【讨论】:

    • 谢谢!!正如上面@jsuddsjr 的评论所提到的,它是否支持单项参数? 忽略单个项目参数,有时也会出现:arg1&amp;arg2&amp;arg3
    【解决方案6】:

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

    options.Request.RequestUri.ParseQueryString();
    

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

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多