c# - data - Il modo più semplice per analizzare i dati formattati "querystring"



asp asp.net (4)

Com'è

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;
}

Con il seguente codice:

string q = "userID=16555&gameID=60&score=4542.122&time=343114";

Quale sarebbe il modo più semplice per analizzare i valori, preferibilmente senza scrivere il mio parser? Sto cercando qualcosa con la stessa funzionalità di Request.querystring["gameID"] .


Answer #1

Come è stato menzionato in ciascuna delle risposte precedenti, se ci si trova in un contesto in cui è possibile aggiungere una dipendenza alla libreria System.Web, utilizzare HttpUtility.ParseQueryString ha senso. (Per riferimento, la fonte pertinente può essere trovata nella fonte di riferimento di Microsoft ). Tuttavia, se ciò non fosse possibile, vorrei proporre la seguente modifica alla risposta Adil's che tiene conto di molte delle preoccupazioni espresse nei commenti (come la distinzione tra maiuscole e minuscole e le chiavi duplicate):

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

Answer #2

Puoi farlo con linq come questo.

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

modificare

Se è possibile utilizzare HttpUtility.ParseQueryString , sarà molto più semplice e non sarà sensibile alla distinzione tra maiuscole e minuscole, come nel caso di LinQ.


Answer #3

Se si desidera evitare la dipendenza da System.Web necessaria per utilizzare HttpUtility.ParseQueryString , è possibile utilizzare il metodo di estensione Uri ParseQueryString trovato in System.Net.Http .

Si noti che è necessario convertire il corpo della risposta in un Uri valido in modo che ParseQueryString .

Si prega di notare anche nel documento MSDN, questo metodo è un metodo di estensione per la classe Uri, quindi è necessario fare riferimento all'assembly System.Net.Http.Formatting (in System.Net.Http.Formatting.dll). Ho provato installato dal pacchetto nuget con il nome "System.Net.Http.Formatting", e funziona bene.

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




postdata