Astaar
Astaar

Reputation: 6548

Newtonsoft JSON deserialiazing to null

I created a Log class mimicking all the properties of the HAR file format as described by the W3C. It's a JSON-formatted file. I have a valid HAR file generated by Chrome that I'm trying to deserialize into that Log object using Newtonsoft Json.

The problem I have is that my object is always null, and no error is thrown. My class looks like this:

public class Log
{
    public int Version { get; set; }
    public Creator Creator { get; set; }
    public IList<Page> Pages { get; set; }
    public IList<Entry> Entries { get; set; }
    public Browser Browser { get; set; }       
    public string Comment { get; set; }

    public Log(){}
}

My code is very simple for now and looks like this:

static void Main(string[] args)
        {
            try
            {
                Log myLog = JsonConvert.DeserializeObject<Log>(File.ReadAllText(@"C:\Users\Me\some.har"));
                Console.WriteLine("Parsed.");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error while parsing: " + ex.InnerException);
            }
        }

No exception is ever caught, and my myLog is always null. I followed the example from the official documentation.

What I wonder is:

  1. The order of the properties in my class must match the JSON/HAR file?
  2. Since I have created my own sub-classes (Creator, Page, Entry, Browser), will the Deserializer understand the format?

Edit: Sample HAR

{
  "log": {
    "version": "1.2",
    "creator": {
      "name": "WebInspector",
      "version": "537.36"
    },
    "pages": [
      {
        "startedDateTime": "2014-01-21T08:24:57.942Z",
        "id": "page_1",
        "title": "http://somewebsite.net/",
        "pageTimings": {
          "onContentLoad": 1903.4998416900635,
          "onLoad": 3104.4998168945312
        }
      }
    ],
    "entries": [
      {
        "startedDateTime": "2014-01-21T08:24:57.942Z",
        "time": 503.49998474121094,
        "request": {
          "method": "GET",
          "url": "http://somewebsite.net/",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "DNT",
              "value": "1"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip,deflate,sdch"
            },
            {
              "name": "Host",
              "value": "somewebsite.net"
            },
            {
              "name": "Accept-Language",
              "value": "en-US,en;q=0.8,fr;q=0.6"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
            },
            {
              "name": "Cookie",
              "value": "some cookie values"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "__utma",
              "value": "102234624.306294763.1379404578.1384330947.1384425583.24",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "__utmz",
              "value": "102234624.1381933765.18.3.utmcsr=cloud.feedly.com|utmccn=(referral)|utmcmd=referral|utmcct=/",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 545,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Tue, 21 Jan 2014 08:24:55 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "gzip"
            },
            {
              "name": "X-AspNetMvc-Version",
              "value": "4.0"
            },
            {
              "name": "Server",
              "value": "Microsoft-IIS/8.0"
            },
            {
              "name": "X-AspNet-Version",
              "value": "4.0.30319"
            },
            {
              "name": "X-Powered-By",
              "value": "ASP.NET"
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "text/html; charset=utf-8"
            },
            {
              "name": "Cache-Control",
              "value": "private"
            },
            {
              "name": "Set-Cookie",
              "value": "ARRAffinity=626d4c1ec24d15067ac8f55d59e3408e76534534521b3fe88ca8293a385ba23f;Path=/;Domain=somewebsite.net"
            },
            {
              "name": "Set-Cookie",
              "value": "WAWebSiteSID=bf378e651bd145f097244bb697d74996; Path=/; HttpOnly"
            },
            {
              "name": "Content-Length",
              "value": "6205"
            }
          ],
          "cookies": [
            {
              "name": "ARRAffinity",
              "value": "626d4c1ec24d15067ac8f55d59e3408e76534534521b3fe88ca8293a385ba23f",
              "path": "/",
              "domain": "somewebsite.net",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "WAWebSiteSID",
              "value": "bf378e651bd145f097244bb697d74996",
              "path": "/",
              "expires": null,
              "httpOnly": true,
              "secure": false
            }
          ],
          "content": {
            "size": 18380,
            "mimeType": "text/html",
            "compression": 12175,
            "text": "htmlcontent"
          },
          "redirectURL": "",
          "headersSize": 506,
          "bodySize": 6205
        },
        "cache": {},
        "timings": {
          "blocked": 16.999999999995907,
          "dns": 50.99999999998772,
          "connect": 108.00000000000409,
          "send": 0,
          "wait": 217.00000000004138,
          "receive": 110.49998474118183,
          "ssl": -1
        },
        "connection": "3557",
        "pageref": "page_1"
      },
      {
        "startedDateTime": "2014-01-21T08:24:58.593Z",
        "time": 846.4999198913574,
        "request": {
          "method": "GET",
          "url": "http://somewebsite.net/Content/bootstrap/bootstrap.css",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "DNT",
              "value": "1"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip,deflate,sdch"
            },
            {
              "name": "Host",
              "value": "somewebsite.net"
            },
            {
              "name": "Accept-Language",
              "value": "en-US,en;q=0.8,fr;q=0.6"
            },
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36"
            },
            {
              "name": "Accept",
              "value": "text/css,*/*;q=0.1"
            },
            {
              "name": "Referer",
              "value": "http://somewebsite.net/"
            },
            {
              "name": "Cookie",
              "value": "__utma=102234624.306294763.1379404578.1384330947.1384425583.24; __utmz=102234624.1381933765.18.3.utmcsr=cloud.feedly.com|utmccn=(referral)|utmcmd=referral|utmcct=/; ARRAffinity=626d4c1ec24d15067ac8f55d59e3408e76534534521b3fe88ca8293a385ba23f; WAWebSiteSID=bf378e651bd145f097244bb697d74996"
            },
            {
              "name": "Connection",
              "value": "keep-alive"
            }
          ],
          "queryString": [],
          "cookies": [
            {
              "name": "__utma",
              "value": "102234624.306294763.1379404578.1384330947.1384425583.24",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "__utmz",
              "value": "102234624.1381933765.18.3.utmcsr=cloud.feedly.com|utmccn=(referral)|utmcmd=referral|utmcct=/",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "ARRAffinity",
              "value": "626d4c1ec24d15067ac8f55d59e3408e76534534521b3fe88ca8293a385ba23f",
              "expires": null,
              "httpOnly": false,
              "secure": false
            },
            {
              "name": "WAWebSiteSID",
              "value": "bf378e651bd145f097244bb697d74996",
              "expires": null,
              "httpOnly": false,
              "secure": false
            }
          ],
          "headersSize": 694,
          "bodySize": 0
        },
        "response": {
          "status": 200,
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "headers": [
            {
              "name": "Date",
              "value": "Tue, 21 Jan 2014 08:24:56 GMT"
            },
            {
              "name": "Content-Encoding",
              "value": "gzip"
            },
            {
              "name": "Last-Modified",
              "value": "Sat, 14 Dec 2013 11:24:09 GMT"
            },
            {
              "name": "Server",
              "value": "Microsoft-IIS/8.0"
            },
            {
              "name": "X-Powered-By",
              "value": "ASP.NET"
            },
            {
              "name": "ETag",
              "value": "\"67d4af1bff8ce1:0\""
            },
            {
              "name": "Vary",
              "value": "Accept-Encoding"
            },
            {
              "name": "Content-Type",
              "value": "text/css"
            },
            {
              "name": "Accept-Ranges",
              "value": "bytes"
            },
            {
              "name": "Content-Length",
              "value": "26323"
            }
          ],
          "cookies": [],
          "content": {
            "size": 126344,
            "mimeType": "text/css",
            "compression": 100021,
            "text": "some content"
          },
          "redirectURL": "",
          "headersSize": 294,
          "bodySize": 26323
        },
        "cache": {},
        "timings": {
          "blocked": 276.00000000001046,
          "dns": -1,
          "connect": -1,
          "send": 0,
          "wait": 452.99999999997453,
          "receive": 117.49991989137243,
          "ssl": -1
        },
        "connection": "3557",
        "pageref": "page_1"
      },
    ]
  }
}

Upvotes: 2

Views: 1077

Answers (1)

Brian Rogers
Brian Rogers

Reputation: 129687

You need a wrapper class:

class Wrapper
{
    public Log log { get; set; }
}

Then deserialize like this:

string json = File.ReadAllText(@"C:\Users\Me\some.har");
Log myLog = JsonConvert.DeserializeObject<Wrapper>(json).Log; 

Upvotes: 1

Related Questions