AndroidAndroidAndroid
AndroidAndroidAndroid

Reputation: 383

Trouble Parsing YouTube v3 JSON Response

I'm having a bit of trouble parsing the JSON response from YouTube but I need a bit of assistance doing so. I'm attempting to obtain the fields: id, videoId, thumbnails and url - using the following:

private String getUrl(String id) throws IOException, JSONException {
    HttpClient client = new DefaultHttpClient();
    HttpGet clientGetMethod = new HttpGet(YOUTUBE_INFO_URL.replace("_ID_", id));
    HttpResponse clientResponse = null;
    clientResponse = client.execute(clientGetMethod);
    String infoString = _convertStreamToString(clientResponse.getEntity().getContent());
    String urldata=new JSONObject(infoString).getJSONObject("id").getJSONObject("videoId").getJSONArray("thumbnails").getJSONObject(0).getString("url");
    return new JSONObject(infoString).getJSONObject("id").getJSONObject("videoId").getJSONArray("thumbnails").getJSONObject(0).getString("url");
}

YouTube API v3 Response: http://pastebin.com/LKWC2Cbz

However I continually get fatal errors due to incorrect parsing. Can someone spot where I may have gone wrong? I'm specifying the fields I need - however I feel like the structure must not match the JSON response in some manner.

Upvotes: 0

Views: 693

Answers (1)

Szabolcs Dézsi
Szabolcs Dézsi

Reputation: 8843

So I assume that infoString contains the JSON response that you pasted to the pastebin link you shared.

This is my first Java program and I'm using Java 8 so things are a little bit different than in your code (I'm using JsonObject for example, not JSONObject, although when reading the program it should be clear what you need to modify)

package stackoverflowyoutubejson;

import java.io.IOException;
import javax.json.*;

public class StackOverflowYoutubeJson {
    public static void main(String[] args) {
        try {
            JsonObject object;
            // Instead of making a Http GET request I just read out the JSON file's contents saved down locally
            try (JsonReader jsonReader = Json.createReader(StackOverflowYoutubeJson.class.getResourceAsStream("input/youtube-response.json"))) {
                object = jsonReader.readObject();
            }

            // Obtaining the items array
            JsonArray items = object.getJsonArray("items");

            // Iterating the items array
            for(int i = 0; i < items.size(); i++) {
                JsonObject item = items.getJsonObject(i);
                JsonString id = item.getJsonString("id");
                System.out.println("id: " + id);

                JsonObject snippet = item.getJsonObject("snippet");
                JsonString videoId = snippet.getJsonObject("resourceId").getJsonString("videoId");
                System.out.println("videoid: " + videoId);

                JsonString url = snippet.getJsonObject("thumbnails").getJsonObject("default").getJsonString("url");
                System.out.println("default thumbnail url: " + url);
                System.out.println();
            }
        }
        catch(IOException e) {
            System.out.println(e);
        }
    }
}

The output of this program is:

id: "PL7ztmfZ6VHFYVLwdKgxI9lwOWFV_yoCFOK5o9K8KSE2s"
videoid: "PcfLDmkpzto"
default thumbnail url: "https://i.ytimg.com/vi/PcfLDmkpzto/default.jpg"

id: "PL7ztmfZ6VHFYVLwdKgxI9l7VIO-rUMLOT7pjiYSbTRPw"
videoid: "D9ohtWGSl9M"
default thumbnail url: "https://i.ytimg.com/vi/D9ohtWGSl9M/default.jpg"

id: "PL7ztmfZ6VHFYVLwdKgxI9l5gWA-vAfTbxQVrUWaMILLA"
videoid: "B1OluIUHLnY"
default thumbnail url: "https://i.ytimg.com/vi/B1OluIUHLnY/default.jpg"

id: "PL7ztmfZ6VHFYVLwdKgxI9l9A2H_-9HSzVlvT--kLf0TA"
videoid: "LjKpcUJSjtM"
default thumbnail url: "https://i.ytimg.com/vi/LjKpcUJSjtM/default.jpg"

id: "PL7ztmfZ6VHFYVLwdKgxI9l9nWIbKA-8Bnu3v_D6xEKaU"
videoid: "fTSmcQdLyhU"
default thumbnail url: "https://i.ytimg.com/vi/fTSmcQdLyhU/default.jpg"

So basically, if you have a JSON like this:

{
    "field1": {
        "nestedField1": "nestedValue1",
        "nestedField2": "nestedValue2"
    },
    "field2": "value2"
}

You can access the fields like this:

JSONObject wholeJson = new JSONObject(jsonStringAsDescribedAbove);
JSONString field2 = wholeJson.getJSONString("field2"); // will contain value2
JSONObject field1 = wholeJson.getJSONObject("field1"); // will contain the whole field1 object
JSONString nestedField1 = wholeJson.getJSONObject("field1").getJSONString("nestedField1"); // or field1.getJSONString("nestedField1");, will contain nestedValue1
JSONString nestedField2 = wholeJson.getJSONObject("field1").getJSONString("nestedField2"); // or field1.getJSONString("nestedField2");, will contain nestedValue2

Upvotes: 2

Related Questions