C# 从 Json 获取 YouTube videoId

C# Get YouTube videoId from Json

我需要帮助。我正在使用 youtube 库为 c# 编写程序。

对于歌曲来说,它是完美的。问题出在播放列表中,我想恢复“videoId”以将其添加到数据库中,以便将视频放入“队列”。

我正在使用这个方法:

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&key= {API key} & maxResults = 50 & playlistId = {id}

其中 return 是 json,但问题是当我想要检索“videoId”字段时。

我已经尝试了很多东西,但无法正常工作。例如:

var json = wc.DownloadString ("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&key=API_KEY&playlistId=PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N");
dynamic data = JObject.Parse (json);
Console.WriteLine ("playlist" + data.items.snippet.resourceId.videoId);
Console.WriteLine ("playlist" + data.items.snippet.videoId);
Console.WriteLine ("playlist" + data.items.videoId);
Console.WriteLine ("playlist" + data.videoId);

它return的json是这样的:

[
  {
    "kind": "youtube#playlistItem",
    "etag": "_ON9HZaMSViWcbtKBRrSkH8D43Y",
    "id": "UEwtUFhLYjVqU2p3YlUwd3pBdUVvb0J2a1o5am5tWFI3Ti4xMjNBNTA2NDBDODU0QTE1",
    "snippet": {
      "publishedAt": "2021-05-17T09:33:13Z",
      "channelId": "UCn3uYZIYTMSvJraGKW2Blhw",
      "title": "C. Tangana, Niño de Elche, La Hungara - Tú Me Dejaste De Querer",
      "description": "C. Tangana – Tú me dejaste de querer ft La Húngara y Niño de Elche \n\nMERCHANDISING: https://www.ctangana.com \nIG: https://www.instagram.com/c.tangana/\nTW: https://twitter.com/c_tangana\nFB: https://www.facebook.com/ctanganaoficial/\n\n\nLyrics Tú Me Dejaste De Querer\n\nTú me dejaste de querer \nCuando te necesitaba\nCuando más falta hacía\nTú me diste la espalda\n\nTú me dejaste de querer\nCuando menos lo esperaba\nCuando más te quería \nSe te fueron las ganas \n\nYo me creía que era el más cabrón \nPero me estoy notando el corazón\nEstás apretando mucho mami déjalo\nSi quieres te doy la razón \nYo lo único que quiero es largarme de aquí \nMe da igual dónde, puedes elegir \nAlgún día dentro de poco me voy a arrepentir \nDe haberte confesado lo que me haces sufrir\n\nTú me dejaste de querer\nCuando menos lo esperaba\nCuando más te quería \nSe te fueron las ganas \n \nDe punta en blanco para ir a tu fiesta\nHe pasado tres días con la misma ropa puesta\nAndo loco por ti, perdiendo apuestas \nDime en quién piensas cuando te acuestas. \nPorque yo pienso en ti (son ilusiones)\nYo pienso en ti (son ilusiones)\nPorque yo pienso en ti (son ilusiones)\nYo pienso en ti (son ilusiones)\n\nTú me dejaste de querer \nCuando te necesitaba\nCuando más falta hacía\nTú me diste la espalda\n\nTú me dejaste de querer\nCuando menos lo esperaba\nCuando más te quería \nSe te fueron las ganas\n\n\n(C) 2020 Sony Music Entertainment España, S.L",
      "thumbnails": {
        "default": {
          "url": "https://i.ytimg.com/vi/ltmO9XQVdSg/default.jpg",
          "width": 120,
          "height": 90
        },
        "medium": {
          "url": "https://i.ytimg.com/vi/ltmO9XQVdSg/mqdefault.jpg",
          "width": 320,
          "height": 180
        },
        "high": {
          "url": "https://i.ytimg.com/vi/ltmO9XQVdSg/hqdefault.jpg",
          "width": 480,
          "height": 360
        },
        "standard": {
          "url": "https://i.ytimg.com/vi/ltmO9XQVdSg/sddefault.jpg",
          "width": 640,
          "height": 480
        },
        "maxres": {
          "url": "https://i.ytimg.com/vi/ltmO9XQVdSg/maxresdefault.jpg",
          "width": 1280,
          "height": 720
        }
      },
      "channelTitle": "Redlist - Las Mejores Canciones",
      "playlistId": "PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N",
      "position": 0,
      "resourceId": {
        "kind": "youtube#video",
        "videoId": "ltmO9XQVdSg"
      },
      "videoOwnerChannelTitle": "CTanganaVEVO",
      "videoOwnerChannelId": "UCPTQlbt5SZO_SpYvC4Ygl-A"
    }
  },
  {
    "kind": "youtube#playlistItem",
    "etag": "4oVVxxoagCYATigtGVg53WXm2ak",
    "id": "UEwtUFhLYjVqU2p3YlUwd3pBdUVvb0J2a1o5am5tWFI3Ti5BRDA1REM4NDZFOEZFOEZF",
    "snippet": {
      "publishedAt": "2021-04-16T05:51:54Z",
      "channelId": "UCn3uYZIYTMSvJraGKW2Blhw",
      "title": "Omar Montes, Ana Mena, Maffio - Solo",
      "description": "“Familia, espero que os guste mi nuevo video “Solo” con mi hermanita Ana Mena y mi amigo Maffio y que todos lo bailéis y mandéis a todos y todas pa´ la Isla de las Tentaciones!!!! OS CAMELO”\n\nOMAR MONTES\nIG: https://www.instagram.com/omarmontesofficial/\nFB: https://www.facebook.com/omarmontessr/\nYOUTUBE: https://www.youtube.com/channel/UC-1BnbAPgInTpJiEi3z2d4A?sub_confirmation=1\n\n\nMusic video by Omar Montes, Ana Mena, Maffio performing Solo. (C) 2021 Sony Music Entertainment España, S.L.",
      "thumbnails": {
        "default": {
          "url": "https://i.ytimg.com/vi/u12F1RY3WJQ/default.jpg",
          "width": 120,
          "height": 90
        },
        "medium": {
          "url": "https://i.ytimg.com/vi/u12F1RY3WJQ/mqdefault.jpg",
          "width": 320,
          "height": 180
        },
        "high": {
          "url": "https://i.ytimg.com/vi/u12F1RY3WJQ/hqdefault.jpg",
          "width": 480,
          "height": 360
        }
      },
      "channelTitle": "Redlist - Las Mejores Canciones",
      "playlistId": "PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N",
      "position": 1,
      "resourceId": {
        "kind": "youtube#video",
        "videoId": "u12F1RY3WJQ"
      },
      "videoOwnerChannelTitle": "OmarMontesVEVO",
      "videoOwnerChannelId": "UCC9RzPoJumhh839VKwGBy6Q"
    }
  },
  {
    "kind": "youtube#playlistItem",
    "etag": "5zp32QT_yZ4pGN90Y7OKL2weCYU",
    "id": "UEwtUFhLYjVqU2p3YlUwd3pBdUVvb0J2a1o5am5tWFI3Ti42OTMwOTQzM0Q0ODU3QkFC",
    "snippet": {
      "publishedAt": "2021-06-04T19:39:36Z",
      "channelId": "UCn3uYZIYTMSvJraGKW2Blhw",
      "title": "BRYAN BAUTISTA - PARA MÍ (Official Video)",
      "description": "",
      "thumbnails": {
        "default": {
          "url": "https://i.ytimg.com/vi/cU_JGIuYsi0/default.jpg",
          "width": 120,
          "height": 90
        },
        "medium": {
          "url": "https://i.ytimg.com/vi/cU_JGIuYsi0/mqdefault.jpg",
          "width": 320,
          "height": 180
        },
        "high": {
          "url": "https://i.ytimg.com/vi/cU_JGIuYsi0/hqdefault.jpg",
          "width": 480,
          "height": 360
        },
        "standard": {
          "url": "https://i.ytimg.com/vi/cU_JGIuYsi0/sddefault.jpg",
          "width": 640,
          "height": 480
        },
        "maxres": {
          "url": "https://i.ytimg.com/vi/cU_JGIuYsi0/maxresdefault.jpg",
          "width": 1280,
          "height": 720
        }
      },
      "channelTitle": "Redlist - Las Mejores Canciones",
      "playlistId": "PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N",
      "position": 2,
      "resourceId": {
        "kind": "youtube#video",
        "videoId": "cU_JGIuYsi0"
      },
      "videoOwnerChannelTitle": "Bryan Bautista",
      "videoOwnerChannelId": "UCxCwpWTTehfcG0wmleUrReg"
    }
  },
  {
    "kind": "youtube#playlistItem",
    "etag": "t2UOHEo3irk0z4ollZOzB1H3eHE",
    "id": "UEwtUFhLYjVqU2p3YlUwd3pBdUVvb0J2a1o5am5tWFI3Ti41RUJCMkQ1ODk1RkI4NDg1",
    "snippet": {
      "publishedAt": "2021-05-14T19:46:26Z",
      "channelId": "UCn3uYZIYTMSvJraGKW2Blhw",
      "title": "Juhn, Jay Wheeler - Fragancia (Official Video)",
      "description": "Juhn, Jay Wheeler - Fragancia (Official Video)\nEncuéntrala en todas las plataformas: https://juhn.lnk.to/FraganciaYD\n\nSigue a Juhn\n➖ Facebook: https://smarturl.it/Juhn_fb\n➖ Instagram: https://smarturl.it/Juhn_ig\n➖ YouTube: https://smarturl.it/Juhn_yt\n➖ Spotify: https://smarturl.it/Juhn_sp\n\nLyrics/Letra\n\nNo sé que hago buscándote\nSi nadie me dice en donde estas\nTu recuerdo jugando con mi mente\nCuando te tengo, ahí mismo tú te vas\nPero ya yo lo entendí \nNo siempre en la vida uno tiene lo que quiere\nTal vez no eras para mi\nPero si supieras lo loco que me tienes\n\nNo hay quien te sustituya\nDesde que tu olor en mi cama me dejaste\nTan rico me lo hiciste\nQue por siempre en mi mente te quedaste\n\nNo hay quien te sustituya\nDesde que tu olor en mi cama me dejaste\nTan rico me lo hiciste\nQue por siempre en mi mente te quedaste\n\nBebecita, yo no olvido la fragancia de tu olor\nEl primer polvo fue rico\nY el segundo fue mejor\nY tú...\nComo media me viraste\nAbusadora, te subiste y no bajaste\nDe la machina, \nEmpieza otro siempre que termina\nQue le hablen sucio, dice que eso le fascina\nDe una mujer así, dime quien se olvida\n\nY no te niego que detrás tengo unas cuantas\nPero eres tú la que me dominas y me encantas\nLa que se lo lleva completo a la garganta\nSoy egoísta, no pidas que te comparta\nSi tú sabes que\n\nEse cuerpito tuyo es mío\nAunque yo no te hice mujer\nYo sé bien que te acuerdas de mi\nEn donde quiera que estés\n\nNo hay quien te sustituya\nDesde que tu olor en mi cama me dejaste\nTan rico me lo hiciste\nQue por siempre en mi mente te quedaste\n\nNo hay quien te sustituya\nDesde que tu olor en mi cama me dejaste\nTan rico me lo hiciste\nQue por siempre en mi mente te quedaste\n\nTe veo por Twitter\nY rápido me da con escribirte indirectas\nSi\nPuedo tener otros culos\nPero pa' mi tú siempre serás la correcta\nY, si me dejan como Pina, te comprometo\nY es que me enchulo ma' cada vez que te lo meto\nBaby yo soy tuyo completo\nPensándote no me puedo estar quieto\nNo, No, No...\n\nTe llamo pero no contestas\nDime si todavía estas dispuesta\nMi cama no es la misma si tú no te acuestas\nY sigo aquí...\n\nTe llamo pero no contestas\nDime si todavía estas dispuesta\nMi cama no es la misma si tú no te acuestas\n\nNo hay quien te sustituya\nDesde que tu olor en mi cama me dejaste\nTan rico me lo hiciste\nQue por siempre en mi mente te quedaste\n\nNo hay quien te sustituya\nDesde que tu olor en mi cama me dejaste\nTan rico me lo hiciste\nQue por siempre en mi mente te quedaste\n\nLa voz favorita baby\nEste ES Juhn \nJay Wheeler Jay Wheeler\nEl All Star\nJay Wheeler Jay Wheeler\nBaby\n\nHoy ando con Jay Wheeler\nLas estrellas siempre andan juntas\nUstedes lo saben ya\nMontana The Producer\nJonniel\nNosotros tenemos la coneccion directa con Willy Wonka\nLos dulces están de este lao\n\n#Juhn #JayWheeler #Fragancia",
      "thumbnails": {
        "default": {
          "url": "https://i.ytimg.com/vi/vN8un8VoPoQ/default.jpg",
          "width": 120,
          "height": 90
        },
        "medium": {
          "url": "https://i.ytimg.com/vi/vN8un8VoPoQ/mqdefault.jpg",
          "width": 320,
          "height": 180
        },
        "high": {
          "url": "https://i.ytimg.com/vi/vN8un8VoPoQ/hqdefault.jpg",
          "width": 480,
          "height": 360
        },
        "standard": {
          "url": "https://i.ytimg.com/vi/vN8un8VoPoQ/sddefault.jpg",
          "width": 640,
          "height": 480
        },
        "maxres": {
          "url": "https://i.ytimg.com/vi/vN8un8VoPoQ/maxresdefault.jpg",
          "width": 1280,
          "height": 720
        }
      },
      "channelTitle": "Redlist - Las Mejores Canciones",
      "playlistId": "PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N",
      "position": 3,
      "resourceId": {
        "kind": "youtube#video",
        "videoId": "vN8un8VoPoQ"
      },
      "videoOwnerChannelTitle": "Juhn",
      "videoOwnerChannelId": "UCTeE0q8xCsbCBL4npUWDPFg"
    }
  },
  {
    "kind": "youtube#playlistItem",
    "etag": "9me0qaU5MYsZOaBTIqwnxgBpqP4",
    "id": "UEwtUFhLYjVqU2p3YlUwd3pBdUVvb0J2a1o5am5tWFI3Ti4xQTlCRURGNEY0QUEyODdD",
    "snippet": {
      "publishedAt": "2021-06-04T19:39:36Z",
      "channelId": "UCn3uYZIYTMSvJraGKW2Blhw",
      "title": "Nobeat, KHEA - Medio Crazy (Official Video)",
      "description": "Nobeat, KHEA - Medio Crazy (Official Video)\n\nEncuéntrala en todas las plataformas https://Nobeat.lnk.to/mediocrazyID\n\nSigue a Nobeat: \nInstagram: https://www.instagram.com/nobeat/ \nTwitter: https://twitter.com/nobeatmusic \nFacebook: https://www.facebook.com/nobeatmusic\nMailing List: https://Nobeat.lnk.to/MailingListID\n\n\nLyrics/Letra\nYa Nobeat\nSon of God\n \nSé que te pasa igual que yo\nte han roto el corazón\nAmigos pocos los que son\nNo sé  ni lo que somos pero sobra la pasión\nTú eres la que manda siempre te doy la razón\n \nTe dedico esta canción\nPa’ que veas que yo\nMe pongo romántico de vez en cuando\nMe encanta ver la cara que pones cuando dices\nTú solito no te mandas ay\n \nTú eres como medio crazy\nPero mejor que muchas por ahí\nQue delicia como bailas pam pam pam\nEl booty te hace así\n \nTú eres como medio crazy\nPero mejor que muchas por ahí\nQue delicia como bailas pam pam pam\n \nEs una loca pero ya no me manda snap\nAhora la tengo bailando como Addison Rae\nSe convirtió en mi favorito snack\nCuando está estresada soy su spa\nSiempre que le caigo\nSe la encesto como Michael\nElla es medio psycho y hace lo que quiere\nCon ese booty me distraigo\nSabe lo que tiene todo natural\nParece que te hicieron pa’ mi\nNo paramos de hablar desde que te conocí\nComo Ester Expósito tu eres elite\nTodos quieren tirarte pero son Mr. Bean\n \nY dale muévelo abusalo\nTú tienes poderes así que úsalos\nBaby excusas no\nPor favor\nTratando de entenderte me gradué\n \nPorque yeah\n \nTu eres medio crazy\nPero mejor que muchas por ahí\nQue delicia como baila pam pam pam\nEl booty te hace así\n \nTú eres como medio crazy\nPero mejor que muchas por ahí\nQue delicia como bailas pam pam pam\n \nElla no juega call of duty pero siempre me mata\nHeadshot\nQue rica que está no es intensa\nMedio crazy no es fácil entenderla\nEs como el algebra de Baldor hey\nNi si fueras un meme te comparto\nTú no eres segundo plato\nBaby please no me preguntes por mi ex no no\n \nNo invoques a Voldemort\nSi confías baby todo es más sencillo\nA mi no me preocupan los demás\nYo los piso y los apago como un cigarrillo\nY dale muévelo abúsalo\nTú tienes poderes así que úsalos\nBaby excusas no por favor\nTratando de entenderte me gradué porque\n \nTú eres como medio crazy\nPero mejor que muchas por ahí\nQue delicia como bailas pam pam pam\nEl booty te hace así\nTú eres com medio crazy\nPero mejor que muchas por ahí\nQue delicia como baila pam pam pam\nEl booty te hace así\n \nKHEA\nYoung Flex Argentina en la casa\nYeah\nNobeat\nDimelo KHEA\nNobeat\n2080’s\n\n#Nobeat #KHEA #MedioCrazy",
      "thumbnails": {
        "default": {
          "url": "https://i.ytimg.com/vi/eBwb5BA-stw/default.jpg",
          "width": 120,
          "height": 90
        },
        "medium": {
          "url": "https://i.ytimg.com/vi/eBwb5BA-stw/mqdefault.jpg",
          "width": 320,
          "height": 180
        },
        "high": {
          "url": "https://i.ytimg.com/vi/eBwb5BA-stw/hqdefault.jpg",
          "width": 480,
          "height": 360
        },
        "standard": {
          "url": "https://i.ytimg.com/vi/eBwb5BA-stw/sddefault.jpg",
          "width": 640,
          "height": 480
        },
        "maxres": {
          "url": "https://i.ytimg.com/vi/eBwb5BA-stw/maxresdefault.jpg",
          "width": 1280,
          "height": 720
        }
      },
      "channelTitle": "Redlist - Las Mejores Canciones",
      "playlistId": "PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N",
      "position": 4,
      "resourceId": {
        "kind": "youtube#video",
        "videoId": "eBwb5BA-stw"
      },
      "videoOwnerChannelTitle": "Nobeat",
      "videoOwnerChannelId": "UCW56a1VqbINaFC50Es_EYvg"
    }
  }
]

我无法return 每个视频“videoId”。

如果有人知道如何解决,我将不胜感激

谢谢。

您可以使用以下代码,而不是去每条路径:

var json = wc.DownloadString ("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&key=API_KEY&playlistId=PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N");
JToken token = JToken.Parse(json);

foreach(var c in token.Children())
  {
     var m = c.SelectToken("$.." + "videoId");
     Console.WriteLine(m);                    
   }

您可以通过 class 序列化您的 json 文件,并以更实用的方式提取数据。见 Microsoft Documentation

我强烈建议您使用 Google APIs Client Library for .NET for which you can look at samples in the dotnet folder on the official GitHub repo 或者将 Json 解析为强类型 classess。

您的代码的基本问题是您将解析为 JObject 而不是 JArray。详情见:Difference between array and object in javascript? or Array Vs Object/

如果您打算继续使用原始 json。您可以将 Json 解析为 JArray 并从中解析 select 视频 ID。

public static List<string> ParseVideoIds()
{
    var json = TestConstants.JsonTest;
    JArray jArray = JArray.Parse(json);
    var videoIds = jArray
        .SelectTokens("$...videoId")
        .Select(x=> x.ToString())
        .ToList();
        
    Console.WriteLine(string.Join(",", videoIds));
    return videoIds.ToList();
}

或者您可以使您的代码更正式,并使用强类型 classes 将您的 json 反序列化为。

  1. 您可以复制 json 并在 Visual Studio 内转到 Edit -> Paste Special -> Paste Json as Classes
  2. 粘贴后,您将拥有强类型 CSharp class,您可以使用 NewtonSoft.Json 对其进行序列化和反序列化,我假设您正在使用问题中的 JObject.Parse 方法。
  3. 不使用 JObject.Parse,而是在将 json 粘贴为 classes 生成的 Rootobject 属性中识别强类型 classes。然后,您可以将 json 反序列化为该类型。在这种情况下,它只是一个 Class1[].
  4. 的数组
  5. 进行实际的序列化
var json = wc.DownloadString("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&key=API_KEY&playlistId=PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N");
var obj = JsonConvert.DeserializeObject<Class1[]>(json);
  1. 仅从强类型 classes 中提取 videoIds:
var videoIds = obj.Select(x => x.snippet.resourceId.videoId).ToList();

综合起来:

public static List<string> ParseVideoIds(string url)
{
    var json = wc.DownloadString(url);
    var obj = JsonConvert.DeserializeObject<Class1[]>(json);
    var videoIds = obj.Select(x => x.snippet.resourceId.videoId).ToList();
    Console.WriteLine(string.Join(",", videoIds));
    return videoIds.ToList();
}

作为参考,这里是使用 Paste Json as 类 生成的 class:

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string kind { get; set; }
    public string etag { get; set; }
    public string id { get; set; }
    public Snippet snippet { get; set; }
}

public class Snippet
{
    public DateTime publishedAt { get; set; }
    public string channelId { get; set; }
    public string title { get; set; }
    public string description { get; set; }
    public Thumbnails thumbnails { get; set; }
    public string channelTitle { get; set; }
    public string playlistId { get; set; }
    public int position { get; set; }
    public Resourceid resourceId { get; set; }
    public string videoOwnerChannelTitle { get; set; }
    public string videoOwnerChannelId { get; set; }
}

public class Thumbnails
{
    public Default _default { get; set; }
    public Medium medium { get; set; }
    public High high { get; set; }
    public Standard standard { get; set; }
    public Maxres maxres { get; set; }
}

public class Default
{
    public string url { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class Medium
{
    public string url { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class High
{
    public string url { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class Standard
{
    public string url { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class Maxres
{
    public string url { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class Resourceid
{
    public string kind { get; set; }
    public string videoId { get; set; }
}

如前所述,您可以忽略 Rootobject

此外,请随时将 Class1(或任何其他 classes 或使用不同模式的 Json 时的 Rootobject)重构为更直观的东西。例如:

public class YouTubePlayListItem
{
    public string kind { get; set; }
    public string etag { get; set; }
    public string id { get; set; }
    public Snippet snippet { get; set; }
}

通过重构,您将拥有:

public static List<string> ParseVideoIds(string url)
{
    var json = wc.DownloadString(url);
    var obj = JsonConvert.DeserializeObject<YouTubePlayListItem[]>(json);
    var videoIds = obj.Select(x => x.snippet.resourceId.videoId).ToList();
    Console.WriteLine(string.Join(",", videoIds));
    return videoIds.ToList();
}

对于 Net 5.0,Microsoft Documentation outlines in more detail what is described above, as pointed out in the answer from

您可以使用 JSON 路径获取视频 ID。

获取所有视频 ID 的令牌是 $...videoId

检查这个 fiddle - https://dotnetfiddle.net/nyngkK

您可以使用此门户验证 JSON 路径标记 - https://jsonpath.com/

下面的代码演示了整个程序,returns 输出为

ltmO9XQVdSg
u12F1RY3WJQ
cU_JGIuYsi0
vN8un8VoPoQ
eBwb5BA-stw

代码

using System;
using System.Threading.Tasks;
using System.Net.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
                    
public class Program
{
    public static void Main()
    {
        RunTest().GetAwaiter().GetResult();
        Console.WriteLine("Hello World");
    }
    
    public async static Task RunTest()
    {
        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            var response = await client.GetAsync("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&key=<<Your Key>>&playlistId=PL-PXKb5jSjwbU0wzAuEooBvkZ9jnmXR7N");
            var content = await response.Content.ReadAsStringAsync();
            
            Console.WriteLine(content);
            
            JObject jObject = JObject.Parse(content);
            var videoIds = jObject.SelectTokens("$...videoId");
            foreach (var videoId in videoIds)
            {
                Console.WriteLine(videoId.Value<string>());
            }
        }
    }
}

从 youtube 返回的 json 是一个数组,所以你必须用 JArray 转换它
它适用于您的 json

using System.IO;
using Newtonsoft.Json.Linq;
using System;

class program
{
    static string json = File.ReadAllText("json.json");
    static void Main(string[] args)
    {
        dynamic data = JArray.Parse(json);
        foreach (dynamic dynamic in data)
            Console.WriteLine(dynamic.snippet.resourceId.videoId);
        Console.ReadKey();
    }
}

了解返回的内容 json 使用 this website