亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java JSON解析中的NullPointerException

java JSON解析中的NullPointerException

海綿寶寶撒 2021-10-20 14:26:29
我第一次嘗試從 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...]
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

第一個問題


您將錯誤的值傳遞給JSONObject構造函數。看這段代碼:


String inputLine;

StringBuffer response = new StringBuffer();


while ((inputLine = in.readLine()) != null) {

    response.append(inputLine);

    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++)

{

    String drzava = arr.getJSONObject(i).getString("Dr?ava");

    System.out.println(drzava);

}

畢竟,如果您查看您的 JSON,它并沒有將Dr?ava帶有數組的屬性名稱作為值。


查看完整回答
反對 回復 2021-10-20
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

您需要獲取 JSONArray,然后對其進行迭代以解析所需的值。


JSONArray array = new JSONArray(inputLine);

for (int i = 0; i < array.length(); i++) {

   System.out.println(array.get(i).get("Dr?ava"));

}


查看完整回答
反對 回復 2021-10-20
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

我認為您對 JSonObject 使用了錯誤的輸入:


double responseCode = conn.getResponseCode();

try (InputStreamReader  sr =new InputStreamReader(conn.getInputStream());

     BufferedReader in = new BufferedReader(sr)){  

// ^ this is Jdk7+, will close your streams after the block exists, like in finally block 


...


JSONObject obj = new JSONObject(response.toString()); // pass the input as a String


....

}catch (IOException | JSONException e) {

    e.printStackTrace();

}

您的response變量以字符串的形式保存輸入,而inputLine僅保存單行。在最后一次迭代之后,它被設置為空。這將導致 NPE。


查看完整回答
反對 回復 2021-10-20
  • 3 回答
  • 0 關注
  • 263 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號