2011-05-15 72 views
2
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+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); 
        } 

       } 

问题: 我需要解析json并检索喜欢的数据。 我可以访问“from”数据但不能“喜欢”数据..当我这样做时,我得到nullreference错误。帮助需要在这里..谢谢。使用system.web.script.seriarilization解析Json或使用json.net

回答

3

EDIT2:

参考https://gist.github.com/973510,从返回JSON其明确的是,如果一个特定的Facebook消息,可是没有任何喜欢,那么返回的JSON犯规含有一种叫likes属性。因此sdata objectlikes财产为空。那就是服务器如何返回数据。

有两种方法可以解决这个问题。要么手动检查likes是否为空。或者在sdata构造函数中初始化likes属性。并在likesdatacollection构造函数中初始化likesdata列表。

代码:

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>(); 
    } 
} 

这样一来,即使FB犯规返回任何喜欢,构造函数将初始化属性,所以他们不会为空。然后你可以检查likes.data.Count > 0。如果是,那么fb返回喜欢,否则fb不会返回喜欢。

EDIT1:

从OP的评论,其明确指出,JSON格式正确。意思是,json是从某个服务器api中检索的。因此它是sdata类是罪魁祸首。请查看this gist以获取完整的解决方案。

简短版本。对于最简单的情况,您的c#类需要遵循与您的json完全相同的结构。根据json,data有一个名为likes的属性。 likes对象有一个名为data的属性,它是具有属性id和名称的对象数组。

所以你的c#类sdata应该有一个类型likesdatacollection类型的属性。这个类应该有一个属性data类型List<likesdata> ...

题外话,人们通常似乎更喜欢Json.Net ...所以你可能想要使用它。我使用它的原因是因为我需要它在.Net 2.0代码库中工作...

+0

除了使用.NET 2.0,是否真的有一个很好的理由使用外部库而不是内置JavaScriptSerializer?除非绝对必要,否则我不会在应用程序中使用外部依赖关系。 – 2011-05-15 17:33:28

+0

顺便说一句,很好的答案。 +1 – 2011-05-15 17:33:48

+0

@Kevin,JavaScriptSerializer位于System.Web内部,因此您将无法使用.NET 3.5及更高版本的客户端配置文件。 – 2011-05-15 17:44:22

1

您应该尝试通过像JSON Lint这样的验证程序来运行您的JSON。这应该会帮助您找到任何JSON错误。

+0

谢谢我跑我的弦和他们没事。 – 2011-05-15 18:31:28