id 类型 java.lang.String 的值 [YoutubePlaylistID] 无法转换为 JSONObject

Value [YoutubePlaylistID] at id of type java.lang.String cannot be converted to JSONObject

我正在尝试创建一个将使用 YoutTube Api 从 YouTube 播放列表中获取所有视频 ID 的应用程序。然后,应用程序将有望在 listView 中显示所有视频 ID。

我正在使用 Volley 来处理所有 HTTPs 请求,我已经将所有 Google Api 依赖项添加到我的项目中,我已经在 Google 上注册了我的应用程序开发人员控制台,我已经在我的 Android 清单文件中请求了互联网许可。

但是,我运行进入这个错误("PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf"是我播放列表的ID):

运行错误

W/System.err: org.json.JSONException: Value PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf at id of type java.lang.String cannot be converted to JSONObject
W/System.err:     at org.json.JSON.typeMismatch(JSON.java:101)
        at org.json.JSONObject.getJSONObject(JSONObject.java:616)
        at com.utilities.dog.MainActivity.onResponse(MainActivity.java:102)
        at com.utilities.dog.MainActivity.onResponse(MainActivity.java:93)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

我在网上看到有人遇到同样的问题。显然,在调用“.getJSONObject”之前定义一个String变量可以解决问题。但是,它对我不起作用,所以我将代码还原为原来的样子。

请看我的代码:

MainActivity.java

ublic class MainActivity extends AppCompatActivity {

    [...]

    // Playlist URL I want to get data from.
    String url = "https://www.googleapis.com/youtube/v3/playlists?part=contentDetails%2C%20snippet%2C%20id&id=PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf&maxResults=25&key=[My API Key is here]";    

    private void getVideoIDs()
    {
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try{
                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray jsonArray = jsonObject.getJSONArray("items");

                    for (int i = 0; i<jsonArray.length(); i++){
                        JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                        JSONObject jsonVideoId =  jsonObject1.getJSONObject("id");
                        String video_id = jsonVideoId.getString("videoID");
                        VideoDetails vd = new VideoDetails();
                        vd.setTitle(video_id);
                        videoDetailsArrayList.add(vd);
                        Toast.makeText(getApplicationContext(), video_id, Toast.LENGTH_SHORT).show();
                    }
                    listView.setAdapter(myCustomAdapter);
                    myCustomAdapter.notifyDataSetChanged();
                }catch(JSONException e){
                    e.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {

                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
            }
        });

        requestQueue.add(stringRequest);
    }
}

VideoDetails.java 是一个 public class 和 getter 和 setter 方法用于两个字符串变量 (标题, videoId)

我还想知道是否需要同时调用 'ContentDetails' 和 'Snippet' 才能从播放列表中获取视频 ID,或者我是否可以只调用两者之一。

希望你能帮助我!

如果需要获取给定播放列表的所有视频 ID(在您的情况下 PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf),您应该查询 PlaylistItems.list endpoint instead of Playlists.list 端点。

这相当于在调用 URL:

时将 playlists 替换为 playlistItems 并将 id 替换为 playlistId

https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails%2C%20snippet%2C%20id&playlistId=PLTpRNmzKHx18bIns2RMyw9czfPIn8SNpf&maxResults=25&key=[My API Key is here]

如果您只需要视频ID,那么part parameter be part=ContentDetails. Those video IDs are to be found at items[].contentDetails.videoId.

就足够了