使用 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 并检索喜欢的数据。我可以访问"来自"数据,但不能访问"喜欢"数据。执行此操作时出现空引用错误。这里需要帮助..谢谢。

使用 system.web.script.seriarilization 或使用 json.net 解析 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 错误。