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 is a format that encodes objects in a string. Serialization means to convert an object into that string, and deserialization is its inverse operation (convert string -> object).
Json structure is made up with {}, [], comma, colon and double quotation marks and it includes the following data types: Object, Number, Boolean, String, and Array. Serialize means convert an object instance to an XML document. Deserialize means convert an XML document into an object instance.
Json namespace provides functionality for serializing to and deserializing from JavaScript Object Notation (JSON). Serialization is the process of converting the state of an object, that is, the values of its properties, into a form that can be stored or transmitted.
JSON.NET doesn't support deserializing non-generic IEnumerable
s.
CookieCollection
implements IEnumerable
and ICollection
, but not IEnumerable<Cookie>
. When JSON.NET goes to deserialize the collection, it doesn't know what to deserialize the individual items in the IEnumerable
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With