2012-04-27 13 views
2

私はJSON.stringify()を使用して、クッキーにブール値を持つ整数キーのjavascript連想配列を保存しました。 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などとなります。javascriptの連想配列をC#Dictionary with Json.Netにデシリアライズ

Json.Netを使用してDictionary<long,bool>などにデシリアライズしたいと思います。私は、このシナリオでは不可能である私は、デシリアライゼーションを推測して、次の

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

を試してみたが、次の例外

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

を取得しますか?

+2

おそらく最初に 'urldecode'する必要がありますか?私はC#で何が呼ばれているのかわかりません。 – Halcyon

+0

それは答えです。 'Uri.UnescapeDataString(cookieValue)' – Alex

答えて

0

フリッツヴァンカンペンが欠けている部分を見つけました。私は簡単にC#でクッキーの値を取得する次の拡張メソッドを書いた。 urlDecodefromJsontrueに設定すると、オブジェクトは正常に逆シリアル化されます。

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