反序列化一个已经被JSON序列化的CookieCollection

9

在我的代码中,我需要将CookieCollection对象进行Json序列化并作为字符串传递,我是这样做的:

var json = Newtonsoft.Json.JsonConvert.SerializeObject(resp.Cookies);

导致以下json结果。
[
 {
  "Comment": "",
  "CommentUri": null,
  "HttpOnly": false,
  "Discard": false,
  "Domain": "www.site.com",
  "Expired": true,
  "Expires": "1970-01-01T03:30:01+03:30",
  "Name": "version",
  "Path": "/",
  "Port": "",
  "Secure": false,
  "TimeStamp": "2015-06-01T12:19:46.3293119+04:30",
  "Value": "deleted",
  "Version": 0
 },
 {
  "Comment": "",
  "CommentUri": null,
  "HttpOnly": false,
  "Discard": false,
  "Domain": ".site.com",
  "Expired": false,
  "Expires": "2015-07-31T12:19:48+04:30",
  "Name": "ADS_7",
  "Path": "/",
  "Port": "",
  "Secure": false,
  "TimeStamp": "2015-06-01T12:19:46.3449217+04:30",
  "Value": "0",
  "Version": 0
 }
]

为了反序列化这个 JSON,我想要做这样的事情:
var cookies = Newtonsoft.Json.JsonConvert.DeserializeObject<CookieCollection>(json);

但它失败了,并引发了 JsonSerializationException ,错误信息如下:

无法创建和填充类型为 System.Net.CookieCollection 的列表。路径 '', 行 1, 位置 1。

所以我将我的代码更改为以下内容,现在它可以工作了。

var tmpcookies = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Cookie>>(json);
CookieCollection cookies = new CookieCollection();
tmpcookies.ForEach(cookies.Add);

我想知道为什么我的第一次尝试失败了?是否有更好的方法可以实现它?

正如http://stackoverflow.com/questions/27449717/newtonsoft-json-cannot-create-and-populate-list-type所述...尝试使用List<Cookie>而不是CookieCollection。您可以通过List<Cookie> cookieList = cookieCollection.OfType<Cookie>().ToList()将其转换为列表。 - Paul Zahra
@PaulZahra 我已经将它定义为List<Cookie>了!我的问题是为什么这个Newtonsoft.Json.JsonConvert.DeserializeObject<CookieCollection>(json);会失败! - HadiRj
CookieCollection cookies = new CookieCollection(); 和 List<Cookie> 有什么相同之处? - Paul Zahra
1
@har07 但是List<T>实现了IEnumerable(以及IEnumerable<T>)和ICollection,而CoockieCollection也实现了这两个接口。 - HadiRj
1个回答

4
JSON.NET不支持反序列化非泛型的IEnumerable。CookieCollection实现了IEnumerable和ICollection,但没有实现IEnumerable。当JSON.NET尝试去反序列化这个集合时,它不知道如何将IEnumerable中的单个项反序列化。
相比之下,IList具有泛型类型参数。JSON.NET可以确定结果列表中每个元素的类型应该是什么。
您可以使用评论中讨论的解决方法来解决此问题,或编写自定义转换器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接