web-dev-qa-db-ja.com

「クエリ文字列」形式のデータを解析する最も簡単な方法

次のコードで:

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

できれば独自のパーサーを作成せずに、値を解析する最も簡単な方法は何でしょうか? Request.querystring["gameID"]と同じ機能を持つものを探しています。

26
Tom Gullen

とても簡単です... 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.
65
Chris Shain

このような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"];

編集

HttpUtility.ParseQueryString を使用できる場合は、はるかに単純になり、LinQの場合のように大文字と小文字が区別されません。

17
Adil

前の各回答で述べたように、System.Webライブラリに依存関係を追加できるコンテキストにいる場合は、 HttpUtility.ParseQueryString を使用するのが理にかなっています。 (参照用に、関連するソースは Microsoft Reference Source にあります)。ただし、これが不可能な場合は、コメントで対処されている多くの懸念事項(大文字と小文字の区別や重複キーなど)を説明する Adil's answerに次の変更を提案したいと思います。

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

HttpUtility.ParseQueryString を使用する必要がある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();
5

これはどのように

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

System.Net.Http ParseQueryString拡張メソッドが機能しました。 ODataクエリオプションを使用して、いくつかのカスタムパラメーターを解析しようとしています。

options.Request.RequestUri.ParseQueryString();

必要なものを提供してくれそうです。

0
MrRobboto