2016-11-04 142 views
0

我的JSON是这样的:C#让孩子们从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” 和 “厚道”。没有其他的。我的问题是:如何读取“项目”下列出的数据?这是我第一次使用JSON,因此我不太了解。感谢一些答案。

+0

你可以在这里粘贴json http://json2csharp.com/并生成c#类 – tym32167

回答

3

创建第二个对象来为子数据建模。如果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对象结构中的对象。另外,考虑使用属性而不是公共字段来支持数据对象中的封装。

+0

你的解决方案工作。非常感谢。我会记住你的提示。 – Guchen

0

您列出的属性是名为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); 
0

这是因为你没有正确建模对象结构。现在,你的JSON的结构类似:

{baseInformation, VideoDetailsArray} 

因此你必须为

public class VideoDetails 
{ 
    //Base information 
    public string kind {get; set;} 
    public string etag {get; set;} 
    //... 
    public List<VideoDetails> {get; set;} 
} 
0

你必须定义你的类的JSON的结构相匹配,以调整你的数据对象:在这种情况下,你应该将items定义为一个独立类的列表,其中包含属性如duration等。您应该将VideoDetails类嵌套在另一个类中,该类可以将这两个对象包装在JSON中,并为contentDetails对象添加另一个类。

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