Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deserialize a json serialized CookieCollection

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.

like image 618
HadiRj Avatar asked Jun 01 '15 07:06

HadiRj


People also ask

What is deserialize and serialize in JSON?

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).

What is JSON serialization and deserialization in C#?

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.

What is a JSON serialized object?

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.


1 Answers

JSON.NET doesn't support deserializing non-generic IEnumerables.

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.

like image 81
Andrew Whitaker Avatar answered Oct 03 '22 02:10

Andrew Whitaker