首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从twitch.tv JSON响应中获取值

从twitch.tv JSON响应中获取值
EN

Stack Overflow用户
提问于 2015-10-01 05:24:45
回答 1查看 812关注 0票数 1

我刚刚开始使用JSON.NET,在从JSON项中获取值时遇到了一些困难。

在过去的几天里,我遇到了一些代码,这将允许我获取名称,而不是他相关的值。

我正在使用twitch.tv Web。这是我的代码:

代码语言:javascript
复制
Dim sUrl As String = Convert.ToString("https://api.twitch.tv/kraken/streams/") & sUsername
Dim wRequest As HttpWebRequest = DirectCast(HttpWebRequest.Create(sUrl), HttpWebRequest)
wRequest.ContentType = "application/json"
wRequest.Accept = "application/vnd.twitchtv.v3+json"
wRequest.Method = "GET"

Dim wResponse As WebResponse = wRequest.GetResponse()
Dim dataStream As Stream = wResponse.GetResponseStream()
Dim reader As New StreamReader(dataStream)
Dim res As String = reader.ReadToEnd()
Dim outer As JToken = JToken.Parse(res)
Dim inner As JObject = outer("stream").Value(Of JObject)()
Dim keys As List(Of String) = inner.Properties().[Select](Function(p) p.Name).ToList()

For Each k As String In keys
    Debug.WriteLine(k)
Next


reader.Close()
wResponse.Close()

原始JSON如下所示:

代码语言:javascript
复制
{
    "_links": {
        "self": "https: //api.twitch.tv/kraken/streams/jojosaysbreee",
        "channel": "https: //api.twitch.tv/kraken/channels/jojosaysbreee"
    },
    "stream": {
        "_id": 16717827552,
        "game": "TomClancy'sRainbowSix: Siege",
        "viewers": 15,
        "created_at": "2015-09-30T21: 19: 10Z",
        "video_height": 720,
        "average_fps": 59.9630366205,
        "is_playlist": false,
        "_links": {
            "self": "https: //api.twitch.tv/kraken/streams/jojosaysbreee"
        },
        "preview": {
            "small": "http: //static-cdn.jtvnw.net/previews-ttv/live_user_jojosaysbreee-80x45.jpg",
            "medium": "http: //static-cdn.jtvnw.net/previews-ttv/live_user_jojosaysbreee-320x180.jpg",
            "large": "http: //static-cdn.jtvnw.net/previews-ttv/live_user_jojosaysbreee-640x360.jpg",
            "template": "http: //static-cdn.jtvnw.net/previews-ttv/live_user_jojosaysbreee-{width}x{height}jpg"
        },
        "channel": {
            "_links": {
                "self": "http: //api.twitch.tv/kraken/channels/jojosaysbreee",
                "follows": "http: //api.twitch.tv/kraken/channels/jojosaysbreee/follows",
                "commercial": "http: //api.twitch.tv/kraken/channels/jojosaysbreee/commercial",
                "stream_key": "http: //api.twitch.tv/kraken/channels/jojosaysbreee/stream_key",
                "chat": "http: //api.twitch.tv/kraken/chat/jojosaysbreee",
                "features": "http: //api.twitch.tv/kraken/channels/jojosaysbreee/features",
                "subscriptions": "http: //api.twitch.tv/kraken/channels/jojosaysbreee/subscriptions",
                "editors": "http: //api.twitch.tv/kraken/channels/jojosaysbreee/editors",
                "videos": "http: //api.twitch.tv/kraken/channels/jojosaysbreee/videos",
                "teams": "http: //api.twitch.tv/kraken/channels/jojosaysbreee/teams"
            },
            "background": null,
            "banner": null,
            "broadcaster_language": "en",
            "display_name": "JOJOsaysbreee",
            "game": "TomClancy'sRainbowSix: Siege",
            "logo": "http: //static-cdn.jtvnw.net/jtv_user_pictures/jojosaysbreee-profile_image-26a326e1c867f257-300x300.jpeg",
            "mature": true,
            "status": "BetaHype<3",
            "partner": false,
            "url": "http: //www.twitch.tv/jojosaysbreee",
            "video_banner": "http: //static-cdn.jtvnw.net/jtv_user_pictures/jojosaysbreee-channel_offline_image-67b08d519585b45f-640x360.jpeg",
            "_id": 41382559,
            "name": "jojosaysbreee",
            "created_at": "2013-03-16T09: 33: 34Z",
            "updated_at": "2015-10-01T05: 15: 26Z",
            "delay": null,
            "followers": 2318,
            "profile_banner": "http: //static-cdn.jtvnw.net/jtv_user_pictures/jojosaysbreee-profile_banner-6abce6a882f4f9e4-480.jpeg",
            "profile_banner_background_color": "#ffffff",
            "views": 15939,
            "language": "en"
        }
    }
}

代码的响应是“stream”中的所有名称:

代码语言:javascript
复制
_id
game
viewers
created_at
video_height
average_fps
is_playlist
_links
preview
channel

我试图完成的是在每一项之后获得所有相关的值,但我似乎不能正确地完成它。我知道它需要更深层次的迭代,但是我尝试过IEnumerable方法,但是没有成功。

所有的帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-01 05:39:30

您将所有的属性名称都选择到一个包含以下行的列表中:

代码语言:javascript
复制
Dim keys As List(Of String) = inner.Properties().[Select](Function(p) p.Name).ToList()

通过这种方式,您将无法从keys获得除属性名称之外的其他任何内容。相反,循环遍历Properties()集合并检查每个JProperty

代码语言:javascript
复制
For Each prop As JProperty In inner.Properties()
    Debug.WriteLine("{0} - {1}", prop.Name, prop.Value)
Next

此外,我建议做一些修改。)用于发出请求的代码比应该使用的代码更难:)

代码语言:javascript
复制
Dim sUrl As String = Convert.ToString("https://api.twitch.tv/kraken/streams/") & sUsername

不需要调用Convert.ToString("") -它已经是一个字符串了。而且(尽管这是一个观点的问题),我认为匈牙利的变量符号是不必要的。这要简单得多:

代码语言:javascript
复制
Dim url As String = "https://api.twitch.tv/kraken/streams/" & username

只使用WebClient要容易得多

代码语言:javascript
复制
Dim client As New WebClient()
client.Headers.Add(HttpRequestHeader.Accept, "application/vnd.twitchtv.v3+json")
Dim responseJson = client.DownloadString(url)

完整的例子:

代码语言:javascript
复制
Dim username As String = "???"
Dim url As String = "https://api.twitch.tv/kraken/streams/" & username

Dim client As New WebClient()
client.Headers.Add(HttpRequestHeader.Accept, "application/vnd.twitchtv.v3+json")
Dim responseJson As String = client.DownloadString(url)

Dim outer As JToken = JToken.Parse(responseJson)
Dim inner As JObject = outer("stream").Value(Of JObject)

For Each prop As JProperty In inner.Properties()
    Console.WriteLine($"{prop.Name} - {prop.Value}")
Next

简单的农民!:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32880002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档