-1 java json nullpointerexception
我试图第一次从web api解析JSON,我得到的是NullPointerException.我所做的是下载json .jar文件并像外部库一样添加它,然后将JSON添加到StringBuffer中,只是为了查看它是否有效 - 添加了System.Out.println.然后我制作了JSON Object但是不确定参数,它应该是stringBuffer对象吗?最后,我尝试制作一个JSON数组并从中搜索字符串"Država",但后来我得到了这个NullPointerException.我哪里错了?
编辑:我还没有使用Maven.
我的代码:
try {
double responseCode = conn.getResponseCode();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
System.out.println("Broj te?ajnice = "+ responseCode);
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
System.out.println(inputLine);
}
JSONObject obj = new JSONObject(inputLine);
JSONArray arr = obj.getJSONArray("Država");
for (int i = 0; i < arr.length(); i++)
{
String drzava = arr.getJSONObject(i).getString("Država");
System.out.println(drzava);
}
in.close();
}
catch (IOException | JSONException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
和来自网络的JSON:
[{"Broj te?ajnice":"188",
"Datum primjene":"30.09.2018",
"Država":"Australija",
"Šifra valute":"036",
"Valuta":"AUD",
"Jedinica":1,
"Kupovni za devize":"4,605078",
"Srednji za devize":"4,618935",
"Prodajni za devize":"4,632792"},
{"Broj te?ajnice":"188",
"Datum primjene":"30.09.2018",
"Država":"Kanada",
"Šifra valute":"124",
"Valuta":"CAD",
"Jedinica":1,
"Kupovni za devize":"4,903440",
"Srednji za devize":"4,918195",
"Prodajni za devize":"4,932950"}
...etc...]
Run Code Online (Sandbox Code Playgroud)
例外:
java.lang.NullPointerException
at java.io.StringReader.<init>(StringReader.java:50)
at org.json.JSONTokener.<init>(JSONTokener.java:66)
at org.json.JSONObject.<init>(JSONObject.java:420)
at pretvaracValuta.PretvaracController.connection(PretvaracController.java:49)
at pretvaracValuta.PretvaracController.initialize(PretvaracController.java:24)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at pretvaracValuta.Main.start(Main.java:14)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$106(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$119(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$117(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$118(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$450(GtkApplication.java:139)
at java.lang.Thread.run(Thread.java:748)
Run Code Online (Sandbox Code Playgroud)
第一个问题
您将错误的值传递给JSONObject构造函数.看看这段代码:
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
System.out.println(inputLine);
}
JSONObject obj = new JSONObject(inputLine);
Run Code Online (Sandbox Code Playgroud)
while只有当inputLine为null 时,循环才会完成- 所以你的最后一行等同于:
JSONObject obj = new JSONObject(null);
Run Code Online (Sandbox Code Playgroud)
......显然不是你想要的.我想你想要:
JSONObject obj = new JSONObject(response.toString());
Run Code Online (Sandbox Code Playgroud)
请注意,您可能希望使用StringBuilder而不是使用StringBuffer,以避免无意义的同步.
下一个问题
如果您的JSON实际上是表单,[ ... ]则它是一个数组,而不是顶层的对象.所以你可能想要:
JSONArray arr = new JSONArray(response.toString());
for (int i = 0; i < arr.length(); i++)
{
String drzava = arr.getJSONObject(i).getString("Država");
System.out.println(drzava);
}
Run Code Online (Sandbox Code Playgroud)
毕竟,如果你看看你的JSON,它没有Država作为值的数组属性的名称.
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |