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

时间:2013-11-21 01:54:01

标签: c# windows-phone-7 json.net

编辑:我想出了如何获取每个密钥,现在问题是循环遍历每个集合。最底层解决方案!

我正在尝试解析具有以下格式的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<int, string>来解决类似的问题,但看起来人们在根目录中没有每个JSON对象。我正在使用JSON.net来解析所有内容。

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

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

我查看了JSON.net文档并使用了词典,所以我尝试使用嵌套词典,它似乎有效!

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

我可以通过以下方式访问artisttitle媒体资源:

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

分别

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

1 个答案:

答案 0 :(得分:3)

如果您尝试使用上述JSON反序列化为Dictionary<int, Dictionary<string, string>>,则会遇到version密钥的问题,因为它不符合字典的数据格式({{1 }}不是version,而int不是1.1)。我知道你说你现在“忽视它”,但这暗示它将来会存在,所以你需要处理它。

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

Dictionary<string, string>

输出:

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"]);
        }
    }
}

documentation中还有许多其他样本。