2017-08-16 185 views
3

我取同一對象的集合的集合從web API。 然後,我會想的JSON反序列化到一個列表C#反序列化JSON的多個集合到一個列表<T>

的JSON如下:

{ 
    "Liverpool": [ 
    { 
     "playerId": "LIV01", 
     "name": "Adam Llana", 
     "position": "Midfielder" 
    }, 
    { 
     "playerId": "LIV02", 
     "name": "Daniel Sturridge", 
     "position": "Forward" 
    } 
    ], 
    "ManchesterUnited": [ 
    { 
     "playerId": "MNU01", 
     "name": "Daley Blind", 
     "position": "Defender" 
    }, 
    { 
     "playerId": "MNU02", 
     "name": "Romelu Lukaku", 
     "position": "Forward" 
    } 
    ], 
    "Arsenal": [ 
    { 
     "playerId": "ARS01", 
     "name": "Petr Cech", 
     "position": "Goalkeeper" 
    }, 
    { 
     "playerId": "ARS02", 
     "name": "Santi Cazorla", 
     "position": "Midfielder" 
    } 
    ] 
} 

我可以想做什麼就能做的是我不感興趣的集合在以下名稱:

public class Player 
{ 
    public string playerId { get; set; } 
    public string name { get; set; } 
    public string position { get; set; } 
} 

List<Player> cards = JsonConvert.DeserializeObject<List<Player>>(jsonContent);  

這不起作用併產生錯誤。

無法反序列化當前JSON對象(例如{\ 「名稱\」:\ 「值\」}) 成型 'System.Collections.Generic.List`1 [播放器]',因爲型 需要一個JSON數組(例如[1,2,3])來正確反序列化。要解決此 錯誤或者改變JSON到JSON陣列(例如[1,2,3])或 變化反序列化類型,以便它是一個正常的.NET類型(例如 不是原始類型像整數,而不是一個集合類型,如數組 或List),可以從JSON對象反序列化。 也可以將JsonObjectAttribute添加到該類型中,以強制它從一個JSON對象反序列化爲 。

有沒有什麼辦法可以用Newtonsoft.Json來完成這個?

回答

5

因爲你需要反序列化到Dictionary<string, List<Player>>變量球隊的名字的。從那裏使用SelectMany詞典中的值來獲得玩家

public class Player 
{ 
    public string playerId { get; set; } 
    public string name { get; set; } 
    public string position { get; set; } 
} 

var teams = JsonConvert.DeserializeObject<Dictionary<string, List<Player>>>(jsonContent); 
List<Player> players = teams.SelectMany(kvp => kvp.Value).ToList(); 
0

如果你只是一味現在創建玩家一個對象,它不會工作作爲球隊名稱是唯一的。您的反序列化類應如下所示:

public class Teams 
{ 
    public Liverpool[] Liverpool { get; set; } 
    public Manchesterunited[] ManchesterUnited { get; set; } 
    public Arsenal[] Arsenal { get; set; } 
} 

public class Liverpool 
{ 
    public string playerId { get; set; } 
    public string name { get; set; } 
    public string position { get; set; } 
} 

public class Manchesterunited 
{ 
    public string playerId { get; set; } 
    public string name { get; set; } 
    public string position { get; set; } 
} 

public class Arsenal 
{ 
    public string playerId { get; set; } 
    public string name { get; set; } 
    public string position { get; set; } 
} 

現在您可以直接將數據反序列化到此對象。

Teams teams = JsonConvert.DeserializeObject<Teams>(jsonContent); 

他們是一個選項知道的在頂部文件菜單粘貼特殊編輯選項裏面,這個選項可以讓你創建一個模仿JSON或XML的屬性的類。

+2

如果OP有1000個團隊進行反序列化,該怎麼辦?如果他們的名字事先不知道怎麼辦?如果未來將一個新的屬性添加到'Player'中呢? – easuter

+1

雅這是這個實現問題。感謝突出問題。 –

3

你需要的是反序列化對象的字典:

var teams = JsonConvert.DeserializeObject<Dictionary<string, List<Player>>>(jsonContent); 

原來的對象不是一個數組,因此無厘頭它反序列化數組或一個List<T>

以後,如果你只想要的球員名單,不關心俱樂部的名字,那麼就使用LINQ的SelectMany拼合詞典:

var allPlayers = teams.SelectMany(entry => entry.Value);