从嵌套的json响应中提取数据

时间:2018-05-22 19:55:42

标签: javascript json axios

所以我正在向新的twitch API发出请求,但我无法从响应中获取数据。

{  
   data:[  
      {  
         id:'28793268096',
         user_id:'71092938',
         game_id:'488552',
         community_ids:[  

         ],
         type:'live',
         title:'NEW EVENT POG ~ twitter.com/xqc',
         viewer_count:9143,
         started_at:'2018-05-22T17:09:12Z',
         language:'en',
         thumbnail_url:'https://static-cdn.jtvnw.net/previews-ttv/live_user_xqcow-{width}x{height}.jpg'
      },
      {  
         id:'28792267216',
         user_id:'23220337',
         game_id:'488552',
         community_ids:[  
            Array
         ],
         type:'live',
         title:'Overwatch Ranked Season 2 Episode 16: Panic! On The Payload | !charity | !patch',
         viewer_count:2332,
         started_at:'2018-05-22T15:25:47Z',
         language:'en',
         thumbnail_url:'https://static-cdn.jtvnw.net/previews-ttv/live_user_emongg-{width}x{height}.jpg'
      }
   ],
   pagination:{  
      cursor:'eyJiIjpudWxsLCJhIjp7Ik9mZnNldCI6Mn19'
   }
}

使用下面的代码我没有从数组中获取任何数据。

var reply = axios.get('https://api.twitch.tv/helix/streams?game_id=488552&type=live&first=2&language=en')
    .then(function(response){
        var datas = response.data;
        //console.log(datas);
        for(var i = 0; i < datas.length; i++) {
            var cube = datas[i];
            for(var j = 0; j < cube.length; j++) {
                msg.reply(cube.id);
            }
        }
}).catch((error) => { console.log(error); });;

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

data数组中包含的值是对象,因此没有length属性。因此,当您处理cube.length时,表达式为false且未运行msg.reply(cube.id)。设置cube后,您应该直接处理它。

在不知道你想要做什么的情况下,我无法提供更多指导。

答案 1 :(得分:0)

如果您使用带有javascript ES6的现代浏览器,这应该可行。 &#34;立方体&#34;对象只是数据数组的子代,所以你只需要遍历数组并抓住id。

response.data.forEach((el, i) => {
  msg.reply(el.id);
});

这是一个小提琴:https://jsfiddle.net/tr7zmrw7/1/

如果你想要一种不太现代的方式,你可以这样做:

for(var i in response.data){
  msg.reply(response.data[i].id);
}

答案 2 :(得分:0)

看起来像是因为您没有发送授权令牌

这里简化了你的例子。你可以看到它击中了错误块并显示:

{
  "error": "Unauthorized",
  "status": 401,
  "message": "Must provide a valid Client-ID or OAuth token"
}

&#13;
&#13;
var reply = axios.get('https://api.twitch.tv/helix/streams?game_id=488552&type=live&first=2&language=en')
    .then(function(response){

    console.log(response)
    
}).catch((error) => {

  console.log('got error')
  console.log(error.response.data);

});
&#13;
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你不要在这样的物体上循环。

你可以msg.reply整个对象:

var reply = axios.get('https://api.twitch.tv/helix/streams?game_id=488552&type=live&first=2&language=en')
    .then(function(response){
        var datas = response.data;
        //console.log(datas);
        for(var i = 0; i < datas.length; i++) {
            msg.reply(datas[i]);
        }
}).catch((error) => { console.log(error); });

或者遍历对象,如:

var reply = axios.get('https://api.twitch.tv/helix/streams?game_id=488552&type=live&first=2&language=en')
        .then(function(response){
            var datas = response.data;
        for(var i = 0; i < datas.length; i++) {
            for (var key in datas[i]) {
                if (!datas[i].hasOwnProperty(key)) continue;
                var obj = datas[key];
                for (var prop in obj) {
                    if(!obj.hasOwnProperty(prop)) continue;
                    console.log(prop + " = " + obj[prop]);
                }
            }
        }
    }).catch((error) => { console.log(error); });