2

以前JSON.stringify()は、ブール値を持つ整数キーのJavaScript連想配列をCookieに格納していましたvar arr = {}; arr[9000001] = True;。サーバー上の文字列の値は次の形式で確認できます。%7B%229000001%22%3Atrue%2C%229000003%22%3Atrue%2C%229000006%22%3Atrue%2C%229000009%22%3Atrue%7D最初の数値は 9000001、2 番目の数値は 9000003 などです。

Json.Netを使用して、Dictionary<long,bool>または類似のものに逆シリアル化したいと思います。私は次のことを試します

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(cookieValue);

しかし、次の例外が発生します

{"Unexpected character encountered while parsing value: %. Path '', line 0, position 0."}

このシナリオでは逆シリアル化は不可能だと思いますか?

4

1 に答える 1

0

フリッツ・ヴァン・カンペンは欠けていたピースを見つけました。C# で Cookie 値を簡単に取得できるようにする次の拡張メソッドを作成しました。と の両方urlDecodeを設定fromJsonするtrueと、オブジェクトは正常に逆シリアル化されます。

/// <summary>
/// retrieve object from cookie
/// </summary>
/// <typeparam name="T">type of object</typeparam>
/// <param name="controller"></param>
/// <param name="cookieName">name of cookie</param>
/// <param name="urlDecode">true to enable url decoding of the string</param>
/// <param name="fromJson">true if the string in cookie is Json stringified</param>
/// <returns>object in the cookie, or default value of T if object does not exist</returns>
public static T GetFromCookie<T>(this Controller controller, string cookieName, 
                                 bool urlDecode = true, bool fromJson = false)
{
    var cookie = controller.HttpContext.Request.Cookies[cookieName];
    if (cookie == null) return default(T);
    var value = cookie.Value;

    if (urlDecode)
        value = Uri.UnescapeDataString(value);

    T result;
    if (fromJson)
        result = JsonConvert.DeserializeObject<T>(value);
    else
        result = (T)Convert.ChangeType(value, typeof(T));

    return result;
}
于 2012-04-27T19:57:45.900 に答える