开发者

parsing Json using system.web.script.seriarilization or using json.net

开发者 https://www.devze.com 2023-03-06 05:57 出处:网络
json =\"{ \"data\": [ { \"id\": \"1000\", \"from\": { \"name\": \"Anthony Waema\", \"category\": \"message\",
json ="{
   "data": [
      {
         "id": "1000",
         "from": {
            "name": "Anthony Waema",
            "category": "message",
            "id": "192"
         },
         "message": "this is the message",
         "updated_time": "2001-05-06T19:34:15+0000",
         "likes": {
            "data": [
               {
                  "id": "100001692250255",
                  "name": "\u00dcnal Turanl\u0131"
               },
               {
                  "id": "100001060078996",
                  "name": "S\u00e9f\u00e2 K\u00e2ql\u00e4Nn"
               }]
              },
         {
         "id": "10150186255753553",
         "from": {
            "name": "another name",
            "category": "message",
            "id": "100001"
         },
         "message": "this is the message",
         "updated_time": "2001-04-06T19:34:15开发者_如何学JAVA+0000",
         "likes": {
            "data": [
               {
                  "id": "1002345",
                  "name": "\u00dcnal Turanl\u0131"
               },
               {
                  "id": "100234",
                  "name": "S\u00e9f\u00e2 K\u00e2ql\u00e4Nn"
               }]
              }
         }
]
}";

public class Allstatus
    {
        public List<sdata> data { get; set; }
        public scpaging paging { get; set; }
    }

public class sdata
    {

        public string id { get; set; }
        public sfrom from { get; set; }
        public string message { get; set; }
        public string updated_time {get; set;}
        public List<likesdata> likes { get; set; }
    }
   public class likesdata
    {
        public string id{ get; set; }
        public string name{ get; set; }
    }
public class sfrom 
{
      public string name {get; set;}
      public string category {get; set;}
      public string id {get; set;}
}

                JavaScriptSerializer ser = new JavaScriptSerializer();
                page = ser.Deserialize<allstatus>(json);
                foreach (sdata cd in page.data)
                {
                    foreach(likesdata ld in  cd.likes.data)
                    {
                        Console.WriteLine(ld.id+"\t"+ld.name);
                    }

                }

problem: I need to parse the json and retrieve likes data. I can access "from" data but not "likes" data.. I get nullreference error when I do this. help needed here.. Thanks.


Edit2:

Referring https://gist.github.com/973510, its clear from the returned json, that if a particular facebook message doesnt have any likes, then the returned json doesnt contain a property called likes. Hence likes property of sdata object is null. Thats just how the server returns the data.

There are two ways you can deal with this. Either do a manual check whether likes is null. Or initialize the likes property in the sdata constructor. And initialize the likesdata list in the likesdatacollection constructor.

Code:

public class sdata
{
    // other properties

    public likedatacollection likes { get; set; }

    public sdata()
    {
        likes = new likedatacollection();
    }
}

public class likedatacollection
{
    public List<likesdata> data { get; set; }

    public likedatacollection()
    {
        data = new List<likesdata>();
    }
}

This way, even if fb doesnt return any likes, the constructors will initialize the properties, so they will not be null. You can then check whether likes.data.Count > 0. If yes, then fb returned likes, else fb didnt return likes.

Edit1:

From the OP's comment, its clear that the json is properly formed. Meaning, the json is as retrieved from some server api. Therefore it is the sdata class that is the culprit. Please look at this gist for the full solution.

The short version. For the simplest case, your c# classes need to follow the exact same structure as your json. As per the json, data has a property called likes. the likes object has a property called data which is an array of objects with properties id and name.

So your c# class sdata should have a property called likes of type likesdatacollection. This class should have a property data of type List<likesdata>...

Off topic, people generally seem to prefer Json.Net ... so you may want to use that. The reason I use it is because I need it to work in a .Net 2.0 code base ...


You should try running your JSON through a validator like JSON Lint. That should help you find any JSON errors.

0

精彩评论

暂无评论...
验证码 换一张
取 消