c#从JSON中获取子节点

本文关键字:获取 子节点 JSON | 更新日期: 2023-09-27 18:16:26

我的JSON是这样的:

 {
   "kind": "youtube#videoListResponse",
   "etag": "'"sZ5p5Mo8dPpfIzLYQBF8QIQJym0/TOPzMxlQJUtRJBXHeKYMXsdEkHs'"",
   "pageInfo": 
   {
     "totalResults": 1,
     "resultsPerPage": 1
   },
   "items": 
     [
       {
         "kind": "youtube#video",
         "etag": "'"sZ5p5Mo8dPpfIzLYQBF8QIQJym0/BIVqr1Mkbule8othzWvZRor92wU'"",
         "id": "QMNkWwq6L4Q",
         "contentDetails": 
         {
           "duration": "PT4M45S",
           "dimension": "2d",
           "definition": "hd",
           "caption": "false",
           "licensedContent": true,
           "projection": "rectangular"
         }
       }
     ]
}

格式可能有点不对,对不起。我试着创建一个这样的类:

public class VideoDetails
{
    public string kind;
    public string etag;
    public string id;
    public string duration;
    public string definition;
    public string caption;
    public string licensedContent;
    public string projection;
}

之后,我反序列化JSON文件:

VideoDetailRead = JsonConvert.DeserializeObject<VideoDetails>(json);

,但我只得到"etag"answers"kind"。什么都没有。我的问题是:我如何读取"项目"下列出的数据?这是我第一次使用JSON,因此我知道的不多。谢谢你的回答。

c#从JSON中获取子节点

创建第二个对象来为子数据建模。如果items属性在contentDetails下也有一个子属性,那么您还需要另一个对象来反序列化这些属性。

public class VideoDetailsItem
{
     public string kind;
     public string etag;
     public string id;
     public VideoContentDetails contentDetails;
}
public class VideoContentDetails
{
     public string duration;
     public string definition;
     public string caption;
     public bool licensedContent;
     public string projection;
}

为父对象添加一个List<VideoDetailsItem>

public class VideoDetails
{
    public string kind;
    public string etag;
    public List<VideoDetailsItem> items;
}

当反序列化JSON对象时,您必须模仿对象中的JSON对象结构。此外,考虑使用属性而不是公共字段,以便在数据对象中进行封装。

您所列出的属性位于名为items的数组中,因此您的对象层次结构必须与此匹配:

public class VideoList
{
    public string kind;
    public string etag;
    // etc...
    public List<VideoDetails> items;
}
public class VideoDetails
{
    public string kind;
    public string etag;
    public string id;
    public string duration;
    public string definition;
    public string caption;
    public string licensedContent;
    public string projection;
}

:

var videos = JsonConvert.DeserializeObject<VideoList>(json);

这是因为您没有正确地建模对象结构。现在,JSON的结构如下:

{baseInformation, VideoDetailsArray}
因此,您必须将数据对象重构为
public class VideoDetails 
{
    //Base information
    public string kind {get; set;}
    public string etag {get; set;}
    //...
    public List<VideoDetails> {get; set;}
}

你必须定义你的类来匹配JSON的结构:在这种情况下,你会定义items作为一个单独的类的列表,在它下面有duration等属性。您应该将VideoDetails类嵌套在另一个可以在JSON中包装两个对象的类中,并为contentDetails对象添加另一个类。

你可以做的一件事是将JSON复制到剪贴板中,在Visual Studio中打开一个新的类文件,然后转到Edit> Paste Special> Paste JSON as Classes。这将为您创建正确的结构,并且您可以看到JSON中的嵌套类如何正确地转换为c#类。