Avec le code suivant:
string q = "userID=16555&gameID=60&score=4542.122&time=343114";
Quelle serait la façon la plus simple d'analyser les valeurs, de préférence sans écrire mon propre analyseur? Je recherche quelque chose avec la même fonctionnalité que Request.querystring["gameID"]
.
Assez facile ... Utilisez la méthode HttpUtility.ParseQueryString .
Non testé, mais cela devrait fonctionner:
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.
Vous pouvez le faire avec linq comme ça.
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"];
Modifier
Si vous pouvez utiliser HttpUtility.ParseQueryString alors ce sera beaucoup plus simple et il ne sera pas sensible à la casse comme dans le cas de LinQ.
Comme cela a été mentionné dans chacune des réponses précédentes, si vous êtes dans un contexte où vous pouvez ajouter une dépendance à la bibliothèque System.Web, utiliser HttpUtility.ParseQueryString est logique. (Pour référence, la source pertinente peut être trouvée dans le Microsoft Reference Source ). Cependant, si cela n'est pas possible, je voudrais proposer la modification suivante à la réponse Adil's qui tient compte de nombreuses préoccupations traitées dans les commentaires (telles que la sensibilité à la casse et les clés en double):
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();
Si vous souhaitez éviter la dépendance à System.Web qui est requise pour utiliser HttpUtility.ParseQueryString , vous pouvez utiliser la méthode d'extension Uri
ParseQueryString
trouvée dans System.Net.Http
.
Notez que vous devez convertir le corps de la réponse en un Uri
valide pour que ParseQueryString
fonctionne.
Veuillez également noter que dans le document MSDN, cette méthode est une méthode d'extension pour la classe Uri, vous devez donc référencer le Assembly System.Net.Http.Formatting (dans System.Net.Http.Formatting.dll). J'ai essayé de l'installer par le paquet nuget avec le nom "System.Net.Http.Formatting", et cela fonctionne très bien.
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();
Comment est-ce
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;
}
La méthode d'extension System.Net.Http ParseQueryString a fonctionné pour moi. J'utilise les options de requête OData et j'essaie d'analyser certains paramètres personnalisés.
options.Request.RequestUri.ParseQueryString();
Semble me donner ce dont j'ai besoin.