In my code I have to Json serialize a CookieCollection object and pass it as string, to achieve this I do like this:
var json = Newtonsoft.Json.JsonConvert.SerializeObject(resp.Cookies);
resulting to the following 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
}
]
To deserialize this json I wanted to do something like this:
var cookies = Newtonsoft.Json.JsonConvert.DeserializeObject<CookieCollection>(json);
But it fails and raise JsonSerializationException saying
Cannot create and populate list type System.Net.CookieCollection. Path '', line 1, position 1.
So I changed my code to the following and its working now
var tmpcookies = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Cookie>>(json);
CookieCollection cookies = new CookieCollection();
tmpcookies.ForEach(cookies.Add);
I am just wondering why my first attempt fails? and if there is any nicer way of doing it.
JSON.NET doesn't support deserializing non-generic
IEnumerable
s.CookieCollection
implementsIEnumerable
andICollection
, but notIEnumerable<Cookie>
. When JSON.NET goes to deserialize the collection, it doesn't know what to deserialize the individual items in theIEnumerable
into.Contrast this with
IList<Cookie>
which has a generic type parameter. JSON.NET can determine what type each element in the resulting list should be.You could fix this using the workaround discussed in the comments, or write a custom converter.