C# 从 Json 获取 YouTube videoId

Posted

技术标签:

【中文标题】C# 从 Json 获取 YouTube videoId【英文标题】:C# Get YouTube videoId from Json 【发布时间】:2021-08-23 01:30:11 【问题描述】:

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

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

我正在使用这种方法:

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

它返回一个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);

它返回的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/omarmontes-s-r/\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"
    
  
]

我无法让它返回每个视频“videoId”。

如果有人知道如何解决,我将非常感激。

谢谢。

【问题讨论】:

我不会使用dynamic,创建一个表示返回数据的C# 类。然后您可以遍历这些项目并为每个项目获取其videoId quicktype.io/csharp 可以帮助您创建一个可以用来表示 JSON 数据的类。在课堂上,您可以随心所欲。 为什么不使用 google .net 客户端库? 【参考方案1】:

您可以使用 JSON Path 来获取视频 ID。

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

检查这个小提琴 - https://dotnetfiddle.net/nyngkK

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

以下代码演示了将输出返回为的整个程序

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>());
            
        
    

【讨论】:

感谢您的帮助,但它不起作用,抛出错误。 |错误|0|意外的命令错误:从 JsonReader 读取 JArray 时出错。当前 JsonReader 项不是数组:StartObject。路径'',第 1 行,位置 1。 @SantiagoMartinez - 运行这个小提琴 -rextester.com/KJW16966 如果你看到任何错误,请告诉我。代码需要一个字符串而不是 JsonReader 对象。 user1672994 是的,按原样复制代码时,它可以正常工作,但是当我要请求 url 时,它会抛出发生在您身上的错误。` var json = wc.DownloadString (" googleapis.com/youtube/v3/…);` @SantiagoMartinez - Google API 返回JObject 而不是您在问题中提到的JArray 的问题。将 JArray 转换为 JObject 应该可以解决您的问题。检查这个dotnetfiddle.net/nyngkK 小提琴。更新您的密钥,您应该能够看到输出。【参考方案2】:

你可以通过一个类来序列化你的json文件,并以更实用的方式拉取数据。见Microsoft Documentation

【讨论】:

*** 是一个只有英文的网站。以后请使用英文版文档的链接。【参考方案3】:

我强烈建议您使用Google APIs Client Library for .NET,您可以查看official GitHub repo 上dotnet 文件夹中的示例,或者将您的Json 解析为强类型类。

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

如果您打算继续使用原始 json。您可以将 Json 解析为 JArray 并从中选择 videoIds。

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();

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

    您可以复制 json 并在 Visual Studio 中转到 Edit -&gt; Paste Special -&gt; Paste Json as Classes 粘贴后,您将拥有强类型 CSharp 类,您可以使用 NewtonSoft.Json 对其进行序列化和反序列化,我假设您正在使用问题中的 JObject.Parse 方法。 不要使用JObject.Parse,而是在Rootobject 属性中识别强类型类,这些属性是通过将您的json 粘贴为类而生成的。然后,您可以将 json 反序列化为该类型。在这种情况下,它只是一个 Class1[] 的数组。 进行实际的序列化
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);
    仅从强类型类中提取 videoId:
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 Classes 生成的类:

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(或使用不同模式的 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 更详细地概述了上述内容,正如Gökdeniz Çetin 的回答中所指出的那样

【讨论】:

它很酷,但很长时间才能获得一些简单的数据 我用更简单的代码更新了答案,只是为了获取简单的数据,即用户询问的视频 ID。但是,在实践中,您还需要获取与某些目标数据点相关的数据,例如更详细的代码提供的标题、缩略图等。 你好@AlexanderHiggins 首先,我感谢你的广泛解释和花时间提供它。其次,照原样复制代码,但它一直在抛出错误,并且它不会恢复数据。在第一个示例中:这是错误:ERROR | 0 |意外的命令错误:解析值时遇到意外的字符:h。路径'',第 0 行,第 0 位置。 第二个例子:|错误 | 0 |意外命令错误:无法将当前 JSON 对象(例如 "name": "value")反序列化为类型“Main + Class1 []”,因为该类型需要 JSON 数组(例如 [1,2,3])来反序列化正确。要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或 List )。 JsonObjectAttribute 也可以添加到类型中以强制其反序列化 一个 JSON 对象。路径“种类”,第 2 行,位置 9。【参考方案4】:

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

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);                    
   

【讨论】:

它不工作,抛出错误。 “|ERROR|0| 意外的命令错误:路径返回了多个标记。” 我使用了您共享的相同 JSON。它工作正常,没有任何错误。请分享您在此修改后使用的代码。另外,分享完整的 JSON。【参考方案5】:

从 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

【讨论】:

以上是关于C# 从 Json 获取 YouTube videoId的主要内容,如果未能解决你的问题,请参考以下文章

获取 YouTube 视频尺寸(宽度/高度)

C# 正则表达式通过 url 从 youtube 和 vimeo 获取视频 ID

使用 JSON 从 YouTube 频道获取视频列表

在 C# 中使用 Youtube API V3 从频道获取视频

youtube呼叫5-获取视频源(视频id)

使用 YouTube API 从带有 JSON 提要的视频中获取所有评论