Search code examples
javaandroidjsonapitwitch

Error while creating a sub JSONObject from another JSONObject


I am working on an Android app and one of its functionnalities is to know when a streamer is streaming by using Twitch API. When a streamer is streaming, if I connect to https://api.twitch.tv/kraken/streams/ I get a String which I use to build a JSON object like that :

{  
   "_links":{  
      "self":"https://api.twitch.tv/kraken/streams/srkevo1",
      "channel":"https://api.twitch.tv/kraken/channels/srkevo1"
   },
   "stream":{  
      "_id":15361851552,
      "game":"Super Smash Bros. for Wii U",
      "viewers":42613,
      "created_at":"2015-07-18T15:07:59Z",
      "video_height":720,
      "average_fps":59.319897084,
      "_links":{  
         "self":"https://api.twitch.tv/kraken/streams/srkevo1"
      },
      "preview":{  
         "small":"http://static-cdn.jtvnw.net/previews-ttv/live_user_srkevo1-80x45.jpg",
         "medium":"http://static-cdn.jtvnw.net/previews-ttv/live_user_srkevo1-320x180.jpg",
         "large":"http://static-cdn.jtvnw.net/previews-ttv/live_user_srkevo1-640x360.jpg",
         "template":"http://static-cdn.jtvnw.net/previews-ttv/live_user_srkevo1-{width}x{height}.jpg"
      },
      "channel":{  
         "_links":{  
            "self":"https://api.twitch.tv/kraken/channels/srkevo1",
            "follows":"https://api.twitch.tv/kraken/channels/srkevo1/follows",
            "commercial":"https://api.twitch.tv/kraken/channels/srkevo1/commercial",
            "stream_key":"https://api.twitch.tv/kraken/channels/srkevo1/stream_key",
            "chat":"https://api.twitch.tv/kraken/chat/srkevo1",
            "features":"https://api.twitch.tv/kraken/channels/srkevo1/features",
            "subscriptions":"https://api.twitch.tv/kraken/channels/srkevo1/subscriptions",
            "editors":"https://api.twitch.tv/kraken/channels/srkevo1/editors",
            "videos":"https://api.twitch.tv/kraken/channels/srkevo1/videos",
            "teams":"https://api.twitch.tv/kraken/channels/srkevo1/teams"
         },
         "background":null,
         "banner":null,
         "broadcaster_language":"en",
         "display_name":"srkevo1",
         "game":"Super Smash Bros. for Wii U",
         "logo":"http://static-cdn.jtvnw.net/jtv_user_pictures/srkevo1-profile_image-e46c53476d9b74c7-300x300.png",
         "mature":null,
         "status":"Evolution 2015 - Main Stage (July 17-19) all brackets http://evo2015.s3.amazonaws.com/brackets/index.html",
         "partner":true,
         "url":"http://www.twitch.tv/srkevo1",
         "video_banner":"http://static-cdn.jtvnw.net/jtv_user_pictures/srkevo1-channel_offline_image-ee2fc39d6ebb7735-640x360.jpeg",
         "_id":30917811,
         "name":"srkevo1",
         "created_at":"2012-05-30T16:57:11Z",
         "updated_at":"2015-07-18T16:18:40Z",
         "delay":0,
         "followers":82134,
         "profile_banner":null,
         "profile_banner_background_color":null,
         "views":20938144,
         "language":"en"
      }
   }
}

This is how I get the JSON Object :

public class GetStreamStatus extends AsyncTask<Void,Void,String> {
        @Override
        protected String doInBackground(Void... params) {
            String res = bibixChannel.getJson("streams");
            return res;
        }

        @Override
        protected void onPostExecute(String s) {
            channelStatusString = s;
            channelStatusObject = bibixChannel.buildJSON(s);
        }
    }

The buildJson() method is simply :

protected JSONObject buildJSON(String jsonRaw){
        JSONObject json = null;
        try{
            json = new JSONObject(jsonRaw);
        }catch (Exception e){
            e.printStackTrace();
        }
        return json;
    }

But after, to know if the streamer is streaming, a part of the JSON string is nulled like that : If the streamer is streaming, you will get the fist JSON I wrote on the top of that post, else you will get something like that :

{  
   "_links":{  
      "self":"https://api.twitch.tv/kraken/streams/bibixhd",
      "channel":"https://api.twitch.tv/kraken/channels/bibixhd"
   },
   "stream":null
}

What I want to do is getting the "stream" part in another instance variable to either recover infos about the stream or to display an offline message.


Solution

  • What i have got from your OP is that the channelStatusObject return you the JSONObject which contains stream key. Now what you want to check is that whether this stream is null or not. So you could do something like :-

    protected JSONObject checkStream(JSONObject parentObject){
            JSONObject json = (JSONObject) parentObject.get("stream");
            return json; // will return null if stream is null else stream JSONObject
        }
    

    You can use this method & check its return value to see if stream is null or not.