为了账号安全,请及时绑定邮箱和手机立即绑定

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条经验 获得超6个赞

第一个问题


您将错误的值传递给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 关注
  • 220 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信