web-dev-qa-db-fra.com

Méthode la plus simple pour analyser les données formatées "querystring"

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"].

26
Tom Gullen

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.
65
Chris Shain

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.

17
Adil

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

Si vous souhaitez éviter la dépendance à System.Web qui est requise pour utiliser HttpUtility.ParseQueryString , vous pouvez utiliser la méthode d'extension UriParseQueryString 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();
5
Amadeus Sánchez

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;
}
3
penguin river

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.

0
MrRobboto