2014-11-24 137 views
0

我正在使用box api,并试图解析json对象到一个类。
这是JSON:解析JSON到对象

{ 
    "type":"folder", 
    "id":"0", 
    "sequence_id":null, 
    "etag":null, 
    "name":"All Files", 
    "created_at":null, 
    "modified_at":null, 
    "description":"", 
    "size":9049537, 
    "path_collection": 
    { 
    "total_count":0,"entries":[] 
    }, 
    "created_by": 
    { 
    "type":"user","id":"","name":"","login":"" 
    }, 
    "modified_by": 
    { 
    "type":"user", 
    "id":"111", 
    "name":"a a", 
    "login":"[email protected]" 
    }, 
    "trashed_at":null, 
    "purged_at":null, 
    "content_created_at":null, 
    "content_modified_at":null, 
    "owned_by": 
    { 
    "type":"user", 
    "id":"111", 
    "name":"a a", 
    "login":"[email protected]" 
    },  
    "shared_link":null, 
    "folder_upload_email":null, 
    "parent":null, 
    "item_status":"active", 
    "item_collection": 
    { 
    "total_count":4, 
    "entries": 
    [ 
     { 
     "type":"file", 
     "id":"22887167395", 
     "sequence_id":"0", 
     "etag":"0", 
     "sha1":"883c99863eefc0f46b3d34915cc4d97a6008fabf", 
     "name":"13.ppt" 
     }, 
     { 
     "type":"file", 
     "id":"22887169687", 
     "sequence_id":"0", 
     "etag":"0", 
     "sha1":"a345fd68b1c90a3678a3e746e0e5343693d8a022", 
     "name":"6.docx" 
     } 
    ], 
    "offset":0, 
    "limit":100, 
    "order": 
    [ 
     { 
     "by":"type", 
     "direction":"ASC" 
     }, 
     { 
     "by":"name", 
     "direction":"ASC" 
     } 
    ] 
    } 
} 

基本上,这是根文件夹(在这种情况下),其中包含两个文件:
13.ppt
6.docx
我创建的类:

[JsonObject(MemberSerialization.OptIn)] 
public class BoxFile 
{ 
    [JsonProperty(PropertyName = "type")] 
    public string Type { get; internal set; } 

    [JsonProperty(PropertyName = "id")] 
    public string Id { get; internal set; } 

    [JsonProperty(PropertyName = "sequence_id")] 
    public string SequenceId { get; internal set; } 

    [JsonProperty(PropertyName = "etag")] 
    public string Etag { get; internal set; } 

    [JsonProperty(PropertyName = "name")] 
    public string Name { get; internal set; } 

    [JsonProperty(PropertyName = "created_at")] 
    public string CreatedAt { get; internal set; } 

    [JsonProperty(PropertyName = "modified_at")] 
    public string ModifiedAt { get; internal set; } 

    [JsonProperty(PropertyName = "description")] 
    public string Description { get; internal set; } 

    [JsonProperty(PropertyName = "size")] 
    public long Size { get; internal set; } 

    [JsonProperty(PropertyName = "item_collection")] 
    public IEnumerable<BoxFile> ItemCollection { get; internal set; } 
} 

但“item_collection”部分没有工作..它给我一个错误..

怎么办我在“item_collection”内获得子文件列表?

我用它由:

private T ParseJson<T>(string json) where T : class, new() 
    { 
      JObject jobject = JObject.Parse(json); 
      return JsonConvert.DeserializeObject<T>(jobject.ToString()); 
    } 

和:

BoxFile parsed = ParseJson<BoxFile>(json); 
+0

指定语言标签请 – 2014-11-24 10:27:24

+0

你的意思是c#? – user990635 2014-11-24 11:33:05

+0

有关错误的事情是它们通常包含用于调试的有用信息。所以不要说“它给我一个错误”。相反,请描述错误,复制并粘贴单词。告诉我们它是否有编译错误或运行时错误等 – Chris 2014-11-24 11:53:45

回答

1

你得到一个错误,因为你的阶级结构不符合您的JSON。具体来说,在JSON中,item_collection属性是一个对象,而不是一个列表。该JSON对象有两个属性,total_countentries,后者包含实际的文件列表。为了解决这个问题,你需要定义另一个类:

public class ItemCollection 
{ 
    [JsonProperty(PropertyName = "entries")] 
    public IEnumerable<BoxFile> Entries { get; internal set; } 
} 

,然后更改ItemCollection财产在你BoxFile类中使用这个新类:

[JsonProperty(PropertyName = "item_collection")] 
    public ItemCollection ItemCollection { get; internal set; } 

然后,您可以访问诸如文件列表这样的:

BoxFile parsed = ParseJson<BoxFile>(json); 

foreach (BoxFile file in parsed.ItemCollection.Entries) 
{ 
    Console.WriteLine(file.Name); 
} 

这里是一个工作演示:https://dotnetfiddle.net/DB9Coc

另外,您可以将ParseJson方法简化为一行。没有必要将JSON解析为JObject,将其重新转换为JSON,然后再解析它。

private T ParseJson<T>(string json) where T : class, new() 
{ 
    return JsonConvert.DeserializeObject<T>(json); 
}