JSONObject中getJSONObject与getString方法无法解析问题求助
问题根源与解决方案
错误原因
你遇到的两个方法找不到的问题,核心是导入的JSON类和代码调用的方法不匹配,加上依赖冲突:
- 你导入的是
org.json.simple.JSONObject,这个类仅提供get()方法(返回Object类型),没有getJSONObject()和getString()这些强类型方法——这些方法属于另一个JSON库的org.json.JSONObject类。 - 你的pom.xml同时引入了
com.googlecode.json-simple和org.json两个JSON处理库,类加载时会出现混淆,即使更换版本也无法解决本质的类不匹配问题。
另外,TMDB搜索接口返回的results是JSON数组,不是单个JSONObject,你的代码里直接用getJSONObject("results")还会导致后续运行时错误,这个也要一起修正。
解决方案(推荐使用org.json库)
1. 修正导入语句
把原来的org.json.simple.JSONObject替换为org.json.JSONObject,同时添加JSONArray的导入:
// 移除这行:import org.json.simple.JSONObject; import org.json.JSONObject; import org.json.JSONArray;
2. 修正方法代码
处理TMDB返回的结果数组,取第一个结果的海报路径:
public static void getImageFromTMDB(String title) { try { String apiKey = "47f285ae13541c6a4e42914c1c8f7ef9"; // 中文标题需要URL编码,否则可能请求失败 String encodedTitle = java.net.URLEncoder.encode(title, StandardCharsets.UTF_8); String urlString = "https://api.themoviedb.org/3/search/movie?api_key=" + apiKey + "&query=" + encodedTitle; URL url = new URL(urlString); String json = IOUtils.toString(url, StandardCharsets.UTF_8); JSONObject jsonObject = new JSONObject(json); // results是数组,用getJSONArray获取 JSONArray results = jsonObject.getJSONArray("results"); if (results.length() == 0) { System.out.println("No movie found for title: " + title); return; } // 取第一个搜索结果 JSONObject firstResult = results.getJSONObject(0); String posterPath = firstResult.getString("poster_path"); if (posterPath == null || posterPath.isEmpty()) { System.out.println("No poster available for this movie"); return; } String imageUrl = "https://image.tmdb.org/t/p/w500" + posterPath; BufferedImage image = ImageIO.read(new URL(imageUrl)); File outputFile = new File("src/main/resources/posters/" + title + ".jpg"); // 确保目录存在,否则保存失败 outputFile.getParentFile().mkdirs(); ImageIO.write(image, "jpg", outputFile); } catch (IOException e) { System.err.println("Error loading poster: " + e.getMessage()); } }
3. 清理pom依赖(可选)
如果只使用org.json库,可以移除json-simple的依赖,避免冲突:
<!-- 移除这部分 --> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency>
备选方案(继续使用json-simple)
如果坚持用json-simple,需要调整代码为其API风格:
1. 保持导入
import org.json.simple.JSONObject; import org.json.simple.JSONArray; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException;
2. 修正方法代码
public static void getImageFromTMDB(String title) { try { String apiKey = "47f285ae13541c6a4e42914c1c8f7ef9"; String encodedTitle = java.net.URLEncoder.encode(title, StandardCharsets.UTF_8); String urlString = "https://api.themoviedb.org/3/search/movie?api_key=" + apiKey + "&query=" + encodedTitle; URL url = new URL(urlString); String json = IOUtils.toString(url, StandardCharsets.UTF_8); // 使用JSONParser解析字符串 JSONParser parser = new JSONParser(); JSONObject jsonObject = (JSONObject) parser.parse(json); JSONArray results = (JSONArray) jsonObject.get("results"); if (results.isEmpty()) { System.out.println("No movie found for title: " + title); return; } JSONObject firstResult = (JSONObject) results.get(0); String posterPath = (String) firstResult.get("poster_path"); if (posterPath == null || posterPath.isEmpty()) { System.out.println("No poster available for this movie"); return; } String imageUrl = "https://image.tmdb.org/t/p/w500" + posterPath; BufferedImage image = ImageIO.read(new URL(imageUrl)); File outputFile = new File("src/main/resources/posters/" + title + ".jpg"); outputFile.getParentFile().mkdirs(); ImageIO.write(image, "jpg", outputFile); } catch (IOException | ParseException e) { System.err.println("Error loading poster: " + e.getMessage()); } }
3. 清理pom依赖(可选)
移除org.json的依赖,避免冲突:
<!-- 移除这部分 --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20220924</version> </dependency>
内容的提问来源于stack exchange,提问作者Cerberos
相关产品推荐
相关产品推荐

