使用数字作为键反序列化JSON

编辑:我想出了如何获得每个键,现在问题是循环每个集合。 底部解决方案!

我正在尝试解析具有以下格式的JSON有效内容:

{ "version": "1.1", "0": { "artist": "Artist 1", "title": "Title 1" }, "1": { "artist": "Artist 2", "title": "Title 2" }, ... "29": { "artist": "Artist 30", "title": "Title 30" } } 

我不需要version密钥,因此我在编写类时忽略它。 这是我到目前为止:

 public class Song { public string artist { get; set; } public string title { get; set; } } 

我已经检查过StackOverflow并且我看到人们使用Dictionary来解决类似的问题,但看起来人们根本没有每个JSON对象。 我正在使用JSON.net来解析所有内容。

在PHP中,我可以轻松地使用json_decode()并遍历数组并提取我需要的所有信息,但我被C#难倒。

编辑:解决方案从下面开始。

我看了JSON.net文档,他们使用了词典,所以我尝试使用嵌套词典,它似乎工作!

 Dictionary<int, Dictionary> song = JsonConvert.DeserializeObject<Dictionary<int, Dictionary>>(json); 

我可以通过以下方式访问artisttitle属性:

 song[0]["artist"] song[0]["title"] 

分别。

这消除了对预构建类的需要。 现在我无法遍历每组数据集(例如歌曲[1],歌曲[2],歌曲[3],…,歌曲[n])的艺术家和标题信息。

如果您尝试使用上面的JSON反序列化为Dictionary> ,那么您将遇到version密钥的问题,因为它不符合字典的数据格式( version不是int1.1不是Dictionary )。 我知道你说你现在“忽视它”,但这意味着它将来会存在,所以你需要处理它。

如果您不想拥有预定义的类,那么最好使用Json.Net的LINQ-to-JSON API来处理数据。 以下是使用此方法获取所需数据的方法:

 class Program { static void Main(string[] args) { string json = @" { ""version"": ""1.1"", ""0"": { ""artist"": ""Artist 1"", ""title"": ""Title 1"" }, ""1"": { ""artist"": ""Artist 2"", ""title"": ""Title 2"" }, ""29"": { ""artist"": ""Artist 30"", ""title"": ""Title 30"" } }"; JObject songs = JObject.Parse(json); foreach (JProperty song in songs.Properties()) { if (song.Name == "version") continue; // skip "version" property Console.WriteLine("Song " + song.Name + " artist: " + song.Value["artist"]); Console.WriteLine("Song " + song.Name + " title: " + song.Value["title"]); } } } 

输出:

 Song 0 artist: Artist 1 Song 0 title: Title 1 Song 1 artist: Artist 2 Song 1 title: Title 2 Song 29 artist: Artist 30 Song 29 title: Title 30 

文档中还有许多其他示例。