jsonObject.getString()解析任意字段均可强转为string

本文探讨了使用JSONObject在处理不同类型的字段时如何进行类型转换。详细分析了getString与getInt方法的区别,前者能将所有类型的值转化为字符串,而后者则只接受数值类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中一直用String s = jsonObject.getString( "s" )来获取字段,突然有一天我们安卓组同事跟后端说,让他们传json数据全部用string类型,否则如果一会传int一会又是string的话我们安卓端解析容易报类型转换异常。

咋一听感觉好像有一定的道理,于是我就把获取的json字符串打印出来,一看确实有的是int有的string。然而奇怪的是,我所有的项目都是用getString来获取字段的,却从没报过类型转换异常。

我就仔细研究了一下,不过说实话,这个真没什么好研究的,一看源码,一清二楚。

public String getString( String key ) {
    verifyIsNull();
    Object o = get( key );
    if( o != null ){
        return o.toString();//非空强转的过程
    }
    throw new JSONException( "JSONObject[" + JSONUtils.quote( key ) + "] not found." );
}

可以看到任意类型的value在return之前都会被强转为string类型,只有在字段为null的时候才会抛出异常。这也就是为什么我一直用getString来获取字段时从没出现过异常的原因。

那么我们再来看看int s = jsonObject.getInt( "s" )能不能像getString一样可以顺利强转,上源码:

public int getInt(String key) {
        verifyIsNull();
        Object o = get(key);
        if (o != null) {
            return o instanceof Number ? ((Number) o).intValue() : (int) getDouble(key);
        }
        throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");
    }

可以看出倘若字段不是int类型就会报错。但若字段为“1234"这种string类型的话也可以顺利转换;若为”abc123“这种就会报错,当然,字段为null的话也会抛出异常。

public List<TmZf> queryTmZfList(JSONObject jsonObject) throws Exception { String id = jsonObject.getString("id"); String country = jsonObject.getString("country"); String oceanTargetName = jsonObject.getString("oceanTargetName"); String satelliteId = jsonObject.getString("satelliteId"); String data = jsonObject.getString("data"); String sortName = jsonObject.getString("prop");//排序字段名称 String sort = jsonObject.getString("order");//排序规则 if (StringUtils.isEmpty(sortName)) { sortName = "archiveDate"; } boolean flag = false; if ("ascending".equals(sort)) { flag = true; } String date = ""; String startTime = ""; String endTime = ""; if (StringUtils.isNotEmpty(data)) { date = data.replace("[", "").replace("]", ""); } if (StringUtils.isNotEmpty(date)) { String[] split = date.split(","); startTime = split[0]; endTime = split[1]; } //条件查询 List<TmZf> tmZfList = tmzfDao.queryTmZfList(country, oceanTargetName, satelliteId, startTime, endTime); //多条件排序 List<TmZf> tmZfs = sortTmZf(tmZfList, sortName, flag); for (TmZf tmZf : tmZfs) { // 雷达侦察参数内容是以text格式存储,因此,这里将其中需要转换的字段摘出来,逐个转义 if(StringUtils.isNotEmpty(tmZf.getLongitude()) && StringUtils.isNotEmpty(tmZf.getLatitude())){ Double longitude = Double.parseDouble(tmZf.getLongitude()); BigDecimal bigDecimal = new BigDecimal(longitude); longitude =bigDecimal.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); Double latitude = Double.parseDouble(tmZf.getLatitude()); BigDecimal bigDecimal1 = new BigDecimal(latitude); latitude =bigDecimal1.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); tmZf.setLatitude(String.valueOf(latitude)); tmZf.setLongitude(String.valueOf(longitude)); } } return tmZfs; } 如果不使用原生sql的方式,这个方法如何修改,可以实现动态排序,jpa框架
07-17
private void saveTaskData(List<JSONObject> taskDataList,String taskStatus,HashMap<String, String> httpHeadersMap) throws Exception{ List<ShipTargetRecord> shipTargetRecords = new ArrayList<>(); List<ShipsInfo> shipsInfoList = new ArrayList<>(); Integer num = 0; for (JSONObject jsonResult : taskDataList) { /* todo 拿到data_id,根据data_id查询是否存在当前数据,存在,更新其他字段,不存在新增 针对 patchPath 更新 shipTargetRecord.setPatch_path(taskData.getString("patchPath")); */ JSONObject taskData = JSONObject.parseObject(jsonResult.toJSONString()); String dataId = taskData.getString("dataId"); String mode = taskData.getString("mode"); if(StringUtils.isEmpty(dataId) && StringUtils.isEmpty(mode)){ throw new Exception("参数错误"); } ShipTargetRecord shipTargetRecord = new ShipTargetRecord(); if("1".equals(mode)){ dataId = "MODE-01-"+dataId; ShipTargetRecord shipTarget = shipTargetRecordDao.queryByDataId(dataId); if(ObjectUtils.isEmpty(shipTarget)){ shipTargetRecord.setPatch_path(""); shipTargetRecord.setDataId(dataId); }else { shipTargetRecord.setPatch_path(shipTarget.getPatch_path()); shipTargetRecord.setDataId(dataId); shipTargetRecord.setMode(shipTarget.getMode()); shipTargetRecord.setId(shipTarget.getId()); num+=1; //webSocketServer.sendInfo(shipTarget.toString(),"ggqb_message"); } }else { dataId = "MODE-02-"+dataId; ShipTargetRecord shipTarget = shipTargetRecordDao.queryByDataId(dataId); if(ObjectUtils.isEmpty(shipTarget)){ shipTargetRecord.setPatch_path(""); shipTargetRecord.setDataId(dataId); }else { shipTargetRecord.setPatch_path(shipTarget.getPatch_path()); shipTargetRecord.setDataId(dataId); shipTargetRecord.setMode(shipTarget.getMode()); shipTargetRecord.setId(shipTarget.getId()); num+=1; //webSocketServer.sendInfo(shipTarget.toString(),"ggqb_message"); } } // shipTargetRecord.setId(Long.parseLong(taskData.getString("id"))); shipTargetRecord.setJsonFilePath(taskData.getString("jsonFilePath")); shipTargetRecord.setAutoMode(taskStatus); shipTargetRecord.setTaskId(httpHeadersMap.get("task-id")); shipTargetRecord.setSpanId(httpHeadersMap.get("span-id")); shipTargetRecord.setParentSpanId(httpHeadersMap.get("parent-span-id")); //shipTargetRecord.setScoutTaskId(taskData.getString("taskId")); shipTargetRecord.setScoutTaskId(httpHeadersMap.get("task-id")); shipTargetRecord.setQbId(taskData.getString("qbId")); //20250310 总体要求临时处理,xx改为JB String satelliteName = taskData.getString("satellite"); if("XX2002".equals(satelliteName)){ satelliteName = "JB20-2"; }else if("XX23".equals(satelliteName)){ satelliteName = "JB23"; }else { satelliteName = "JB20-1"; } shipTargetRecord.setSatelliteName(satelliteName); shipTargetRecord.setSrcImgName(taskData.getString("srcImgName")); /*shipTargetRecord.setPatch_path(taskData.getString("patchPath"));*/ shipTargetRecord.setScoutTime(taskData.getString("detectTime")); shipTargetRecord.setShipNum(taskData.getString("shipNum")); shipTargetRecord.setMode(taskData.getString("mode")); shipTargetRecord.setArchiveDate(DateUtils.getNowTime()); shipTargetRecords.add(shipTargetRecord); JSONArray shipsInfoArray = taskData.getJSONArray("shipsInfo"); for (Object o : shipsInfoArray) { JSONObject jsonObject = JSONObject.parseObject(o.toString()); ShipsInfo shipsInfo = new ShipsInfo(); shipsInfo.setShipId(jsonObject.getString("shipId")); shipsInfo.setMode(taskData.getString("mode")); shipsInfo.setScoutTime(taskData.getString("detectTime")); shipsInfo.setQbId(taskData.getString("qbId")); shipsInfo.setCenterPointInImage(jsonObject.getString("centerPointInImage")); shipsInfo.setCornerPointsInImage(jsonObject.getString("cornerPointsInImage")); shipsInfo.setPatchCornerPoints(jsonObject.getString("cornerPointsInWgs84")); String centerPointInWgs84 = jsonObject.getString("centerPointInWgs84"); String[] split = centerPointInWgs84.replace("[","").replace("]","").split(","); shipsInfo.setCenterLongitude(split[0]); shipsInfo.setCenterLatitude(split[1]); if("2".equals(mode)){ String patchCornerPoints = getPatchCornerPoints(split[0],split[1]); shipsInfo.setPatchCornerPoints(patchCornerPoints); } shipsInfo.setVelocity(jsonObject.getString("speed")); shipsInfo.setDirection(jsonObject.getString("direction")); shipsInfo.setName(jsonObject.getString("targetName")); shipsInfo.setTargetLevel(jsonObject.getString("targetLevel")); shipsInfo.setTargetType(jsonObject.getString("targetType")); shipsInfo.setTargetProp(jsonObject.getString("targetProp")); shipsInfo.setTargetLength(jsonObject.getString("targetLength")); shipsInfo.setTargetWidth(jsonObject.getString("targetWidth")); shipsInfo.setCredit(jsonObject.getString("conf")); shipsInfo.setTargetAngle(jsonObject.getString("targetAngle")); shipsInfo.setTargetId(jsonObject.getString("targetId")); shipsInfo.setSpeedError(jsonObject.getString("speedError")); shipsInfo.setSpeedDim(jsonObject.getString("speedDim")); shipsInfo.setDirectionError(jsonObject.getString("directionError")); shipsInfo.setErrorType(jsonObject.getString("errorType")); shipsInfo.setPosshipex(jsonObject.getString("precision")); if("0".equals(taskStatus)){ shipsInfo.setRemark("0");//自动 已判读 }else { shipsInfo.setRemark("1");//人工 未判读 } shipsInfo.setTaskId(httpHeadersMap.get("task-id")); shipsInfoList.add(shipsInfo); } } List<ShipsInfo> saveAll = shipsInfoDao.saveAll(shipsInfoList); log.info("任务数据中目标数据保存结果------>:{}",saveAll.size()); List<ShipTargetRecord> result = shipTargetRecordDao.saveAll(shipTargetRecords); log.info("******************************高轨数据接入完成*****************************",result.size()); //向业管上报状态 systemConfigService.ggpzToBms(httpHeadersMap); if(num>0){ webSocketServer.sendInfo(String.valueOf(num),"ggqb_message"); } } private void savePatchPathData(List<JSONObject> patchPathData) throws Exception{ for (JSONObject jsonObject : patchPathData){ String dataId = jsonObject.getString("dataId"); String mode = jsonObject.getString("mode"); if("1".equals(mode)){ dataId = "MODE-01-" + dataId; ShipTargetRecord shipTarget = shipTargetRecordDao.queryByDataId(dataId); if(ObjectUtils.isEmpty(shipTarget)){ ShipTargetRecord shipTargetRecord = new ShipTargetRecord(); shipTargetRecord.setPatch_path(jsonObject.getString("patchPath")); shipTargetRecord.setDataId(dataId); shipTargetRecordDao.saveAndFlush(shipTargetRecord); }else { shipTarget.setPatch_path(jsonObject.getString("patchPath")); shipTargetRecordDao.saveAndFlush(shipTarget); /*webSocketServer.sendInfo(shipTarget.toString(),"ggqb_message");*/ } }else { String patchPath = jsonObject.getString("patchPath"); //截取patchPath的路径 Path path = Paths.get(patchPath); String parentPath = path.getParent().toString(); //遍历patchPath,拿到当前目录下所有.tif结尾的文件 List<String> tifFiles = new ArrayList<>(); File dir = new File(parentPath); File[] files = dir.listFiles(); log.info(">>>>>上级目录下的所有文件:{}",files.toString()); for (File file : files) { if (file.isFile() && file.getName().endsWith(".tiff")) { tifFiles.add(file.getAbsolutePath()); } } log.info(">>>>>上级目录下的所有tiff:{}",tifFiles.toString()); for (String tifPath : tifFiles){ String tifName = tifPath.substring(tifPath.lastIndexOf("/") + 1,tifPath.lastIndexOf(".")); dataId = "MODE-02-" + tifName; ShipTargetRecord shipTarget = shipTargetRecordDao.queryByDataId(dataId); if(ObjectUtils.isEmpty(shipTarget)){ ShipTargetRecord shipTargetRecord = new ShipTargetRecord(); shipTargetRecord.setPatch_path(tifPath); shipTargetRecord.setDataId(dataId); shipTargetRecordDao.saveAndFlush(shipTargetRecord); }else { shipTarget.setPatch_path(tifPath); shipTargetRecordDao.saveAndFlush(shipTarget); } } } } } 这是我的两个方法,通过两个不同的接口调用,如果同时调用这两个接口,就会导致通过dataid都没匹配上,从而导致没有通过dataid合并数据,而是各插入了一条,如何解决
最新发布
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值