使用system.web.script.seriarilization解析Json或使用json.net
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
EDIT2:
参考https://gist.github.com/973510,从返回JSON其明确的是,如果一个特定的Facebook消息,可是没有任何喜欢,那么返回的JSON犯规含有一种叫likes
属性。因此sdata object
的likes
财产为空。那就是服务器如何返回数据。
有两种方法可以解决这个问题。要么手动检查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代码库中工作...
除了使用.NET 2.0,是否真的有一个很好的理由使用外部库而不是内置JavaScriptSerializer?除非绝对必要,否则我不会在应用程序中使用外部依赖关系。 – 2011-05-15 17:33:28
顺便说一句,很好的答案。 +1 – 2011-05-15 17:33:48
@Kevin,JavaScriptSerializer位于System.Web内部,因此您将无法使用.NET 3.5及更高版本的客户端配置文件。 – 2011-05-15 17:44:22