2015-06-19 107 views
2

編輯:簡化類使用JSON解析.NET反序列化()與嵌套的「列表」

{ 
    "name": "Final Five", 
    "bio": null, 
    "noPlayers": "0", 
    "roster": { 
    "players0": { 
     "playerId": "3516", 
     "name": "Gate", 
     "role": "Mid Lane", 
     "isStarter": 1 
    }, 
    "players1": { 
     "playerId": "3826", 
     "name": "Veritas", 
     "role": "AD Carry", 
     "isStarter": 1 
    }, 
    "players2": { 
     "playerId": "4054", 
     "name": "Novel", 
     "role": "Support", 
     "isStarter": 1 
    }, 
    "players3": { 
     "playerId": "4142", 
     "name": "Wizardry", 
     "role": "Top Lane", 
     "isStarter": 0 
    }, 
    "players4": { 
     "playerId": "4555", 
     "name": "Metroid", 
     "role": "Jungler", 
     "isStarter": 0 
    }, 
    "players5": { 
     "playerId": "4554", 
     "name": "Chau", 
     "role": "Jungler", 
     "isStarter": 0 
    }, 
    "players6": { 
     "playerId": "3847", 
     "name": "Biofrost", 
     "role": "Support", 
     "isStarter": 0 
    } 
    }, 
    "logoUrl": "http://riot-web-cdn.s3-us-west-1.amazonaws.com/lolesports/s3fs-public/final-five-logo.png", 
    "profileUrl": "http://na.lolesports.com/node/3498", 
    "teamPhotoUrl": "http://na.lolesports.com/", 
    "acronym": "F5" 
} 

我已經被我的端接收到這個JSON。我遇到的問題是試圖將球員解析爲列表而不是個人元素,因爲球員的數量可能會有所不同。我試過使用數組和列表。這是我已經設置了類

public class Player 
    { 
     public string playerId { get; set; } 
     public string name { get; set; } 
     public string role { get; set; } 
     public int isStarter { get; set; } 
    } 

    public class Roster 
    { 
     public Player players0 { get; set; } 
     public Player players1 { get; set; } 
     public Player players2 { get; set; } 
     public Player players3 { get; set; } 
     public Player players4 { get; set; } 
     public Player players5 { get; set; } 
     public Player players6 { get; set; } 
    } 

    public class Team 
    { 
     public string name { get; set; } 
     public object bio { get; set; } 
     public string noPlayers { get; set; } 
     public Roster roster { get; set; } 
     public string logoUrl { get; set; } 
     public string profileUrl { get; set; } 
     public string teamPhotoUrl { get; set; } 
     public string acronym { get; set; } 
    } 

這是我的反序列化:

Team team = new JavaScriptSerializer().Deserialize<Team>(responseText); 
+0

請顯示您一直在嘗試的反序列化代碼。 –

+0

你爲什麼不能嘗試這樣的事情,例如 '名單數據= JsonConvert.DeserializeObject <列表>(jsonString);'做簡單的谷歌搜索以及太 – MethodMan

+0

@MethodMan:顯然,它不是那麼簡單 –

回答

0

一種可能性是反序列化到一個動態對象,並從轉換到你的強類型對象。像這樣:

var dict = new JavaScriptSerializer().Deserialize<dynamic>(responseText); 

所得dict對象是一個字典,以表示爲在字典中的名稱 - 值對每個屬性。嵌套對象,如roster和其所含的playersX對象本身表示爲字典。

因此,舉例來說,你會得到的player1對象的name屬性,像這樣:

Assert.AreEqual("Veritas", dict["roster"]["players1"]["name"]); 

如果有幫助的一切,你可以只作roster財產dynamic,像這樣:

public class Team 
{ 
    public string name { get; set; } 
    public object bio { get; set; } 
    public string noPlayers { get; set; } 
    public dynamic roster { get; set; } 
    public string logoUrl { get; set; } 
    public string profileUrl { get; set; } 
    public string teamPhotoUrl { get; set; } 
    public string acronym { get; set; } 
} 

那麼只有屬性將被反序列化詞典的詞典。