编辑:我想出了如何获取每个 key ,现在问题是遍历每个集合。解决方案在底部!
我正在尝试解析具有以下格式的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);
我可以通过以下方式访问
artist
和title
属性:song[0]["artist"]
song[0]["title"]
分别。
这消除了对预构建类的需求。现在,我在遍历每组数据时都遇到麻烦(例如,关于song [1],song [2],song [3],...,song [n]的艺术家和标题信息)。
最佳答案
如果您尝试使用上述JSON反序列化为Dictionary<int, Dictionary<string, string>>
,则version
key 会遇到问题,因为它不适合字典的数据格式(version
不是int
,1.1
不是Dictionary<string, string>
)。我知道您说过您“暂时忽略它”,但这意味着它会在将来出现,因此您需要处理它。
如果您不想拥有预定义的类,那么最好使用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
在documentation中可以找到许多其他示例。
关于c# - 以数字为键反序列化JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20110988/