C#解析嵌套的JSON数组以获取值

问题描述 投票:-1回答:1

我一直在寻找并试图让它工作几个小时,我完全没有想法。我有JSON文本,我正在尝试阅读,无法看到它让它工作。这是JSON文本。

[{“first_aired”:“2018-03-03T01:00:00.000Z”,“剧集”:{“season”:3,“number”:13,“title”:“警告镜头”,“ids”:{ “trakt”:2814272,“tvdb”:6445735,“imdb”:“tt7462514”,“tmdb”:1429184,“tvrage”:0}},“show”:{“title”:“Blindspot”,“year” :2015,“ids”:{“trakt”:98980,“slug”:“blindspot”,“tvdb”:295647,“imdb”:“tt4474344”,“tmdb”:62710,“tvrage”:44628}}} ,{“first_aired”:“2018-03-03T01:00:00.000Z”,“剧集”:{“season”:2,“number”:16,“title”:“Hammock + Balcony”,“ids”: {“trakt”:2874663,“tvdb”:6535389,“imdb”:“tt7820776”,“tmdb”:1428050,“tvrage”:0}},“show”:{“title”:“MacGyver”,“year “:2016,”ids“:{”trakt“:107792,”slug“:”macgyver-2016“,”tvdb“:311902,”imdb“:”tt1399045“,”tmdb“:67133,”tvrage“:{ }}}}]

我正试图获得“剧集 - >季节”和“剧集 - >数字”这是我一直在使用的代码,也是下面的小提琴。

    string json = "[{\"first_aired\":\"2018-03-03T01:00:00.000Z\",\"episode\":{\"season\":3,\"number\":13,\"title\":\"Warning Shot\",\"ids\":{\"trakt\":2814272,\"tvdb\":6445735,\"imdb\":\"tt7462514\",\"tmdb\":1429184,\"tvrage\":0}},\"show\":{\"title\":\"Blindspot\",\"year\":2015,\"ids\":{\"trakt\":98980,\"slug\":\"blindspot\",\"tvdb\":295647,\"imdb\":\"tt4474344\",\"tmdb\":62710,\"tvrage\":44628}}},{\"first_aired\":\"2018-03-03T01:00:00.000Z\",\"episode\":{\"season\":2,\"number\":16,\"title\":\"Hammock + Balcony\",\"ids\":{\"trakt\":2874663,\"tvdb\":6535389,\"imdb\":\"tt7820776\",\"tmdb\":1428050,\"tvrage\":0}},\"show\":{\"title\":\"MacGyver\",\"year\":2016,\"ids\":{\"trakt\":107792,\"slug\":\"macgyver-2016\",\"tvdb\":311902,\"imdb\":\"tt1399045\",\"tmdb\":67133,\"tvrage\":null}}}]";
    JArray obj = Newtonsoft.Json.JsonConvert.DeserializeObject<JArray>(json);


    foreach (var result in obj)
    {
        foreach (JObject tvshow in result["episode"])
        {
            string season_num = (string)tvshow["season"];
            string episode_num = (string)tvshow["number"];

            Console.WriteLine(season_num + " - " + episode_num );
        }
    }

https://dotnetfiddle.net/speUyL

感谢任何人都可以给我的帮助!

c# arrays json
1个回答
4
投票

你实际上有嵌套对象,所以你需要首先提取episode对象然后从episode你可以访问它的属性numberseason等:

foreach (var result in obj)
{
    var episode = result["episode"];
    Console.WriteLine(episode["season"]);
    Console.WriteLine(episode["number"]);
}

这将打印您尝试执行的结果。以下是更新的小提琴演示:

https://dotnetfiddle.net/WN545C

一个简单的方法是为你的json设置DTO c#类,然后将json结果反序列化为List<T>。你的json的类将是:

public class Ids
{
    public int trakt { get; set; }
    public int tvdb { get; set; }
    public string imdb { get; set; }
    public int tmdb { get; set; }
    public int tvrage { get; set; }
}

public class Episode
{
    public int season { get; set; }
    public int number { get; set; }
    public string title { get; set; }
    public Ids ids { get; set; }
}

public class Ids2
{
    public int trakt { get; set; }
    public string slug { get; set; }
    public int tvdb { get; set; }
    public string imdb { get; set; }
    public int tmdb { get; set; }
    public object tvrage { get; set; }
}

public class Show
{
    public string title { get; set; }
    public int year { get; set; }
    public Ids2 ids { get; set; }
}

public class Season
{
    public DateTime first_aired { get; set; }
    public Episode episode { get; set; }
    public Show show { get; set; }
}

获取生成的类的简单方法是使用Json2CSharp.com或使用可以paste JSON as C# classes using Paste Special的Visual Studio功能。现在,您可以更好地反序列化和访问每个季节数据:

var seasons = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Season>>(json);

foreach (var season in seasons)
{

    Console.WriteLine(season.episode.title);
    Console.WriteLine(season.first_aired);
    Console.WriteLine(season.episode.season);
    Console.WriteLine(season.episode.number);
}

你可以在这里玩这个演示:

https://dotnetfiddle.net/hukLQI

© www.soinside.com 2019 - 2024. All rights reserved.