【发布时间】:2015-08-26 13:58:43
【问题描述】:
我将一个对象序列化为 JSON 字符串,以便将其存储在 cookie 中。对象如下所示:
public class ShoppingCart
{
public List<ShoppingCartItem> Items { get; set; }
public ShoppingCart()
{
Items = new List<ShoppingCartItem>();
}
}
public class ShoppingCartItem
{
public enum ShoppingCartItemType
{
TypeOfItem,
AnotherTypeOfItem
}
public int Identifier { get; set; }
public ShoppingCartItemType Type { get; set; }
}
然后我希望能够以 JSON 字符串的形式从 cookie 中检索对象,并将其解码回 ShoppingCart 类型的对象,并正确反序列化其项目。
这是我用来执行此操作的代码:
public class CookieStore
{
public static void SetCookie(string key, object value, TimeSpan expires)
{
string valueToStore = Json.Encode(value);
HttpCookie cookie = new HttpCookie(key, valueToStore);
if (HttpContext.Current.Request.Cookies[key] != null)
{
var cookieOld = HttpContext.Current.Request.Cookies[key];
cookieOld.Expires = DateTime.Now.Add(expires);
cookieOld.Value = cookie.Value;
HttpContext.Current.Response.Cookies.Add(cookieOld);
}
else
{
cookie.Expires = DateTime.Now.Add(expires);
HttpContext.Current.Response.Cookies.Add(cookie);
}
}
public static object GetCookie(string key)
{
string value = string.Empty;
HttpCookie cookie = HttpContext.Current.Request.Cookies[key];
if (cookie != null)
{
value = cookie.Value;
}
return Json.Decode(value);
}
}
请注意,存储 cookie 效果很好。它具有正确的名称,并且 JSON 字符串对我来说看起来不错;这是一个例子:
{"Items":[{"Identifier":1,"Type":1}]}
问题是,当我尝试反序列化它时,我认为它没有认识到该数组实际上是一个 List<ShoppingCartItem>,所以我最终得到了一个 ShoppingCart 类的实例,其中 Items 属性设置为空List<ShoppingCartItem>.
有谁知道我怎样才能做到这一点?如果可能的话,我更愿意继续使用标准的System.Web.Helpers.Json,但如果需要更强大的 JSON 序列化器,我愿意这样做。
【问题讨论】:
-
您是否希望该对象始终是
ShoppingCart的实例?如果是这样,我认为显式转换类型,即Json.Decode<List<ShoppingCart>>(value),应该可以解决问题。 -
@MarkM 我能够使用您的评论作为对此的回答,非常感谢!我更改了 GetCookie 方法以接受类型参数并使用相同类型运行解码。 (顺便说一下,所需的类型是
ShoppingCart,而不是List<ShoppingCart>)。您可以发表您的评论作为答案吗?我愿意接受它,以便您获得信用。 -
谢谢 gnack。我发布了答案,很高兴我能提供帮助:)
-
能否请您粘贴您获得的需要在对象中反序列化的确切 Json,我想知道 Json 是否正确,那么为什么它不转换为对象,顺便说一句,哪个 Json 序列化器您正在使用并且正在使用 Web API 控制器
标签: c# json asp.net-mvc cookies