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

C# 最简单的解析方法";“查询字符串”;格式化数据,c#,asp.net,query-string,postdata,C#,Asp.net,Query String,Postdata,使用以下代码: string q = "userID=16555&gameID=60&score=4542.122&time=343114"; 解析值的最简单方法是什么,最好不用编写自己的解析器?我正在寻找与请求具有相同功能的东西。查询字符串[“gameID”]非常简单。。。使用 未经测试,但这应该有效: var qs = "userID=16555&gameID=60&score=4542.122&time=343114"; var parse

使用以下代码:

string q = "userID=16555&gameID=60&score=4542.122&time=343114";
解析值的最简单方法是什么,最好不用编写自己的解析器?我正在寻找与请求具有相同功能的东西。查询字符串[“gameID”]

非常简单。。。使用

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

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.

你可以用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"];
string query=“id=3123123&userId=44423&format=json”;
字典dicQueryString=
query.Split(“&”)
.ToDictionary(c=>c.Split('=')[0],
c=>Uri.UnescapeDataString(c.Split('=')[1]);
字符串userId=diquerystring[“userId”];
编辑


如果您可以使用,那么它将更加直截了当,并且不会像LinQ那样区分大小写

正如前面的每个答案中所提到的,如果您处于可以向System.Web库添加依赖项的上下文中,使用是有意义的。(有关资料可参阅)。但是,如果这不可能,我想提出以下修改,以回答意见中提出的许多问题(如区分大小写和重复密钥):


如果您想避免需要使用的对System.Web的依赖,可以使用
System.Net.Http
中的
Uri
扩展方法
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;
}
使用System.Text.regular表达式;
//查询示例
//“name1=value1&name2=value2&name3=value3”
//“?名称1=value1&name2=value2&name3=value3”
专用字典解析查询(字符串查询)
{
var dic=新字典();
var reg=new Regex(((?:[?&]|^)([^&]+)=([^&]*)”;
var matches=reg.matches(查询);
foreach(匹配中的匹配){
dic[match.Groups[1].Value]=Uri.UnescapeDataString(match.Groups[2].Value);
}
返回dic;
}

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

options.Request.RequestUri.ParseQueryString();

似乎给了我所需要的。

谢谢!看起来不错,但是一旦我有了
var q=HttpUtility.ParseQueryString(“?userID=16555&gameID=60&score=4542.122&time=343114”),我就无法解码他们在MSDN页面上提供的可怕示例如何检索特定值?我找不到System.Net.HttpUtility Net Core 1.0 frameworkSeems,就像他们删除了它一样。参考此处的答案以获得解决方案:该库还包括
Nancy.Helpers.HttpUtility.ParseQueryString
。在这种特定情况下有效,但它不是通用解决方案,因为它不进行百分比解码。Right@Francis Avila,然后需要在查询中进行更多修改。如果您需要在System.Web上下文之外解析查询字符串,这是一个很好的解决方案。这保留了大小写,与ParseQueryString不同。当您有一个类似于
a=1&a=2&a=3
的查询字符串时会发生什么?这是有效的,因为
a=1;a=2;a=3
。使用
HttpUtility.ParseQueryString
。它处理这些和其他奇怪的事情。不确定这是否有效…Uri没有附加ParseQueryString方法。当我尝试此操作时,我的代码是:var collection=new System.Uri(url.ParseQueryString()@TrevorHart是否确实添加了对System.Net.Http的引用并添加了System.Net.Http命名空间?我确实添加了,最后我只编写了自己的解析器。忽略有时也会出现的单项参数:
arg1&arg2&arg3
谢谢!!它是否支持单项参数,如上面@jsuddsjr的评论所述?忽略有时也会出现的单个项参数:
arg1&arg2&arg3
options.Request.RequestUri.ParseQueryString();