猿问

java JSON解析中的NullPointerException

我第一次尝试从 web api 解析 JSON,我得到的是 NullPointerException。我所做的是下载 json .jar 文件并像外部库一样添加它,然后将 JSON 添加到 StringBuffer 中,看看它是否有效 - 添加了 System.Out.println。然后我制作了 JSON 对象但不确定参数,它应该是 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();

    }

和来自网络的 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...]


海绵宝宝撒
浏览 221回答 3
3回答

LEATH

第一个问题您将错误的值传递给JSONObject构造函数。看这段代码:String inputLine;StringBuffer response = new StringBuffer();while ((inputLine = in.readLine()) != null) {&nbsp; &nbsp; response.append(inputLine);&nbsp; &nbsp; System.out.println(inputLine);}JSONObject obj = new JSONObject(inputLine);该while循环只会完成的时候inputLine是空-所以你的最后一行是等价于:JSONObject obj = new JSONObject(null);......这显然不是你想要的。我想你想要:JSONObject obj = new JSONObject(response.toString());请注意,您可能希望使用StringBuilder而不是StringBuffer同时使用,以避免无意义的同步。下一个问题如果您的 JSON 实际上是这种形式,[ ... ]那么它就是一个数组,而不是顶层的对象。所以你可能想要:JSONArray arr = new JSONArray(response.toString());for (int i = 0; i < arr.length(); i++){&nbsp; &nbsp; String drzava = arr.getJSONObject(i).getString("Država");&nbsp; &nbsp; System.out.println(drzava);}毕竟,如果您查看您的 JSON,它并没有将Država带有数组的属性名称作为值。

子衿沉夜

您需要获取 JSONArray,然后对其进行迭代以解析所需的值。JSONArray array = new JSONArray(inputLine);for (int i = 0; i < array.length(); i++) {&nbsp; &nbsp;System.out.println(array.get(i).get("Država"));}

慕雪6442864

我认为您对 JSonObject 使用了错误的输入:double responseCode = conn.getResponseCode();try (InputStreamReader&nbsp; sr =new InputStreamReader(conn.getInputStream());&nbsp; &nbsp; &nbsp;BufferedReader in = new BufferedReader(sr)){&nbsp;&nbsp;// ^ this is Jdk7+, will close your streams after the block exists, like in finally block&nbsp;...JSONObject obj = new JSONObject(response.toString()); // pass the input as a String....}catch (IOException | JSONException e) {&nbsp; &nbsp; e.printStackTrace();}您的response变量以字符串的形式保存输入,而inputLine仅保存单行。在最后一次迭代之后,它被设置为空。这将导致 NPE。
随时随地看视频慕课网APP

相关分类

Java
我要回答