解析“查询字符串”格式的数据最简单的方法(Easiest way to parse “queryst

2019-06-27 01:50发布

用下面的代码:

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

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

Answer 1:

很容易...使用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.


Answer 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的情况。



Answer 3:

正如在先前的每个答案已经提到,如果你是在一个范围内,您可以添加一个依赖System.Web程序库,使用HttpUtility.ParseQueryString是有道理的。 (作为参考,相关的源可以在发现微软参考源 )。 但是,如果这是不可能的,我想提出以下修改阿迪尔的回答占许多在意见中提到的关注(如大小写和重复键):

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


Answer 4:

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

请注意,您必须响应主体转换为有效Uri使ParseQueryString工作。

也请注意,MSDN文档中,这种方法对于Uri类的扩展方法,所以你需要引用的程序集System.Net.Http.Formatting(在System.Net.Http.Formatting.dll)。 我试图通过NuGet包名为“System.Net.Http.Formatting”安装了它,它工作正常。

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


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


文章来源: Easiest way to parse “querystring” formatted data