You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:22:42