Проблемы с анализом ответа YouTube v3 JSON

У меня возникли проблемы с разбором ответа JSON с YouTube, но мне нужна помощь. Я пытаюсь получить поля: id, videoId, thumbnails и url, используя следующее:

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: http://pastebin.com/LKWC2Cbz

Однако я постоянно получаю фатальные ошибки из-за неправильного синтаксического анализа. Может ли кто-нибудь заметить, где я мог ошибиться? Я указываю поля, которые мне нужны, однако я чувствую, что структура не должна каким-то образом соответствовать ответу JSON.


person AndroidAndroidAndroid    schedule 19.09.2015    source источник


Ответы (1)


Поэтому я предполагаю, что infoString содержит ответ JSON, который вы вставили в ссылку pastebin, которой вы поделились.

Это моя первая программа на Java, и я использую Java 8, поэтому все немного отличается от вашего кода (например, я использую JsonObject, а не JSONObject, хотя при чтении программы должно быть ясно, что вам нужно изменить )

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

Вывод этой программы:

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"

В общем, если у вас есть такой JSON:

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

Вы можете получить доступ к полям следующим образом:

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
person Szabolcs Dézsi    schedule 19.09.2015