Самый простой способ проанализировать форматированные данные "querystring"
Со следующим кодом:
string q = "userID=16555&gameID=60&score=4542.122&time=343114";
Каким будет самый простой способ проанализировать значения, желательно без написания собственного анализатора? Я ищу что-то с той же функциональностью, что и Request.querystring["gameID"]
.
Ответы
Ответ 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.
Ответ 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"];
Edit
Если вы можете использовать HttpUtility.ParseQueryString, тогда он будет намного более прямым, и он не будет чувствителен к регистру, как в случае с LinQ.
Ответ 3
Как уже упоминалось в каждом из предыдущих ответов, если вы находитесь в контексте, где вы можете добавить зависимость от библиотеки 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();
Ответ 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();