【发布时间】: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
使用以下代码:
string q = "userID=16555&gameID=60&score=4542.122&time=343114";
解析值的最简单方法是什么,最好不编写我自己的解析器?我正在寻找与Request.querystring["gameID"] 功能相同的东西。
【问题讨论】:
标签: c# asp.net query-string postdata
很简单...使用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.
【讨论】:
var q = HttpUtility.ParseQueryString("?userID=16555&gameID=60&score=4542.122&time=343114"); 我如何检索特定值?
Nancy.Helpers.HttpUtility.ParseQueryString。
ParseQueryString 失败是因为字符串中有超过 1024 个键值对。
你可以像这样用 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 那样区分大小写。
【讨论】:
a=1&a=2&a=3这样的查询字符串时会发生什么?这是有效的,a=1;a=2;a=3 也是如此。使用HttpUtility.ParseQueryString。它处理这些和其他奇怪的事情。
正如前面每个答案中提到的,如果您处于可以向 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&arg2&arg3
如果您想避免使用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();
【讨论】:
这是怎么回事
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;
}
【讨论】:
arg1&arg2&arg3
System.Net.Http ParseQueryString 扩展方法对我有用。我正在使用 OData 查询选项并尝试解析一些自定义参数。
options.Request.RequestUri.ParseQueryString();
似乎给了我我需要的东西。
【讨论】: