2015-06-19 111 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; } 
} 

那么只有属性将被反序列化词典的词典。