使用org.json存储与获取Long类型数据时抛出JSONException的问题排查
搞定org.json的Long类型异常问题
嘿,你遇到的这两个问题本质上是踩了同一个坑!我来给你掰扯清楚:
核心原因:用错了方法!
org.json里的append()方法根本不是用来设置单个值的——它的作用是把值塞进数组里!
看你问题二里的代码:
jo.append("theLong", 1l);
执行完这行,"theLong"对应的已经不是单个的1了,而是一个JSON数组[1]!这时候你调用getLong("theLong"),方法会以为对应的值是单个数字,结果拿到的是数组的字符串形式"[1]",自然转不成long,直接抛出NumberFormatException,也就是你看到的那个异常。
问题一的情况大概率也是一样的:你存储long的时候误用了append(),导致实际存的是数组,取的时候用getLong()自然就报错说“不是long类型”了。哪怕你传的是装箱后的Long对象,append()照样会把它包装成数组,所以没用。
正确姿势来了!
场景1:存单个long/Long值
如果你只是想存单个数字,别用append(),改用put()方法:
JSONObject jo = new JSONObject(); // 存基本类型long jo.put("theLong", 1L); // 或者存装箱后的Long对象也没问题 jo.put("theLong", new Long(1L)); // 现在可以正常取到值了 Long theLong = jo.getLong("theLong");
场景2:确实需要存数组
如果你的业务就是要存多个long值(数组形式),那取的时候得先拿数组,再从数组里取元素:
JSONObject jo = new JSONObject(); jo.append("theLong", 1L); jo.append("theLong", 2L); // 现在数组是[1,2] // 先获取JSON数组 JSONArray longArray = jo.getJSONArray("theLong"); // 再取数组里的指定元素 Long firstLong = longArray.getLong(0);
额外提一嘴org.json的append逻辑
顺便给你补个知识点:append()的行为是这样的:
- 如果键不存在,直接创建一个新的JSONArray把值加进去
- 如果键已经存在且是数组,就把新值追加进去
- 如果键已经存在但不是数组,会先把原有值转成数组,再追加新值
所以不管你传的是long还是Long,只要用append(),最终都会变成数组,这就是为什么换Long对象也解决不了问题的原因。
内容的提问来源于stack exchange,提问作者F___ThisToxicCommunityHere
相关产品推荐
相关产品推荐

