【问题标题】:Deserialize javascript associative array into C# Dictionary with Json.Net使用 Json.Net 将 javascript 关联数组反序列化为 C# 字典
【发布时间】:2012-05-08 13:39:18
【问题描述】:

我使用JSON.stringify() 在 cookie 中存储一个带有布尔值的整数键的 javascript 关联数组,例如var arr = {}; arr[9000001] = True;。我可以看到服务器上字符串的值,格式如下:%7B%229000001%22%3Atrue%2C%229000003%22%3Atrue%2C%229000006%22%3Atrue%2C%229000009%22%3Atrue%7D 其中第一个数字是 9000001,第二个是 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."}

我猜在这种情况下无法进行反序列化?

【问题讨论】:

  • 也许你需要先urldecode?我不知道它在 C# 中叫什么。
  • 这就是答案。 Uri.UnescapeDataString(cookieValue)

标签: javascript .net json serialization json.net


【解决方案1】:

Frits van Campen 找到了丢失的部分。我编写了以下扩展方法,可以轻松地在 C# 中检索 cookie 值。将urlDecodefromJson都设置为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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多