使用 system.web.script.seriarilization 或使用 json.net 解析 Json
本文关键字:json net 解析 Json system web script seriarilization 使用 | 更新日期: 2023-09-27 17:56:24
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 并检索喜欢的数据。我可以访问"来自"数据,但不能访问"喜欢"数据。执行此操作时出现空引用错误。这里需要帮助..谢谢。
edit2:
参考 https://gist.github.com/973510,从返回的 json 中可以清楚地看出,如果特定的 facebook 消息没有任何喜欢,那么返回的 json 不包含名为 likes
的属性。因此likes
sdata object
的属性为空。 这就是服务器返回数据的方式。
有两种方法可以解决此问题。执行手动检查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 不返回任何喜欢,构造函数也会初始化属性,因此它们不会为 null。然后,您可以检查是否likes.data.Count > 0
。如果是,则 fb 返回喜欢,否则 fb 不返回喜欢。
编辑1:
从OP的评论中,很明显json的格式正确。这意味着,json 是从某些服务器 API 检索的。因此,sdata
阶级是罪魁祸首。请查看此要点以获取完整的解决方案。
简短版本。对于最简单的情况,c# 类需要遵循与 json 完全相同的结构。根据 json,data
有一个名为 likes
的属性。likes
对象有一个名为 data
的属性,该属性是具有属性 ID 和名称的对象数组。
因此,您的 c# 类sdata
应该具有一个名为 likes
的属性,类型为 likesdatacollection
。此类应具有类型为 List<likesdata>
的属性data
...
题外话,人们通常似乎更喜欢 Json.Net......所以你可能想使用它。我使用它的原因是因为我需要它在 .Net 2.0 代码库中工作......
您应该尝试通过像JSON Lint这样的验证器运行JSON。这应该可以帮助您找到任何 JSON 错误。