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
.
就足够了
我正在尝试创建一个将使用 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
.