这个依赖很重要,我们将围绕fastjson中的JSONObject这个类来谈转换
com.alibabafastjson1.2.15
String转成JSON
Stringjson ="{\"abc\":\"1\",\"hahah\":\"2\"}";JSONObject jsonObject = JSONObject.parseObject(content);
一句话就能解决,非常便捷。想要取出值,可以对`jsonObject`进行操作:
jsonObject.getString("abc");
结果为:`1`
将String转为list后转为JSON
Listlist=newArrayList();list.add("username");list.add("age");list.add("sex"); JSONArrayarray=newJSONArray();array.add(list);
将String转为map后转为JSON
Mapmap=newHashMap();map.put("abc","abc");map.put("def","efg");JSONArray array_test =newJSONArray();array_test.add(map); JSONObject jsonObject = JSONObject.fromObject(map);
特别注意:从JSONObject中取值,碰到了数字为key的时候,如
{"userAnswer": {"28568": {"28552": {"qId":"28552","order":"1","userScore": {"score":100},"answer": {"28554":"28554"},"qScore":"100.0","qtype":"SingleChoice","sId":"28568"} } },"paperType":"1","paperOid":"28567","instanceId":30823,"remainingTime":-1,"examOid":"28570"}
获取“userAnswer”的value,再转成JSON,可仿照如下形式:
JSONObjectuserJson = JSONObject.parseObject(jsonObject.getString("userAnswer"));
但是想获取key"28568"就没这么容易了。直接像上述的写法,会报错。我们浏览fastjson中的源码,总结下,应该如下写:
JSONObject question = (JSONObject) JSONObject.parseObject(section.getString("28568"),Object.class);
整体代码:
dao代码很容易,就不贴出来了。packagecom.xiamenair.training.business.service;importcom.alibaba.fastjson.JSONObject;importcom.xiamenair.training.business.dao.elearningdao.ELearningExamInstanceDao;importcom.xiamenair.training.business.dao.masterdao.ELearningChoiceRecordDao;importcom.xiamenair.training.business.model.LasChoiceRecord;importcom.xiamenair.training.business.model.entity.elearning.LasExamInstance;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Service;importjava.math.BigDecimal;importjava.sql.Blob;importjava.sql.SQLException;importjava.text.SimpleDateFormat;importjava.util.*;@ServicepublicclassChoiceRecordService{//查询数据Dao@AutowiredprivateELearningChoiceRecordDao eLearningChoiceRecordDao;//转储数据Dao@AutowiredprivateELearningExamInstanceDao eLearningExamInstanceDao;privateChoiceRecordService(){ }privatestaticclassSingletonRecordInstance{privatestaticfinalLasChoiceRecord choiceRecord =newLasChoiceRecord(); }publicstaticLasChoiceRecordgetMapInstance(){returnSingletonRecordInstance.choiceRecord; }privatestaticSimpleDateFormat simpleDateFormat =newSimpleDateFormat("yyyy-MM-dd");/** * 定时任务,每天定时将E学网考试数据分析并转储 * *@param: instanceIdList *@return: void *@author: 28370·皮育才 *@date: 2018/11/20 **/@Scheduled(cron ="00 00 01 * * ?")publicvoidanalysisChoiceRecord(){//获取前一天的时间Date date =newDate(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(calendar.DATE, -1); date = calendar.getTime(); String dateString = simpleDateFormat.format(date); List instanceIdList = eLearningExamInstanceDao.findInstanceIdByFinishTime(dateString);if(0!= instanceIdList.size()){ LasChoiceRecord lasChoiceRecord = getMapInstance(); instanceIdList.stream().forEach(instanceId -> { Blob answerBlob = eLearningExamInstanceDao.findUserAnswer(instanceId); Long userId = eLearningExamInstanceDao.findUserId(instanceId); String content =null;try{ content =newString(answerBlob.getBytes((long)1, (int) answerBlob.length())); }catch(SQLException e) { e.printStackTrace(); System.out.println("SQLEXCEPTION:"+ e); } JSONObject jsonObject = JSONObject.parseObject(content);//针对本section的"公共"属性直接设置lasChoiceRecord.setUserId(userId); lasChoiceRecord.setPaperType(jsonObject.getString("paperType")); lasChoiceRecord.setPaperId(jsonObject.getString("paperOid")); lasChoiceRecord.setExamInstanceId(jsonObject.getString("instanceId")); lasChoiceRecord.setRemainingTime(jsonObject.getString("remainingTime")); lasChoiceRecord.setExamId(jsonObject.getString("examOid"));//针对section中的题目进行细化循环拆分JSONObject userJson = JSONObject.parseObject(jsonObject.getString("userAnswer")); Set sectionSet = userJson.keySet(); Iterator setIt = sectionSet.iterator(); analyzeAnswer(lasChoiceRecord, userJson, setIt); }); } }privatevoidanalyzeAnswer(LasChoiceRecord lasChoiceRecord, JSONObject userJson, Iterator<String> setIt){while(setIt.hasNext()) {//对每个question进行再次拆分出题目JSONObject section = (JSONObject) JSONObject.parseObject(userJson.getString(setIt.next()), Object.class); Set questionSet = section.keySet(); Iterator queIt = questionSet.iterator();while(queIt.hasNext()) { JSONObject question = (JSONObject) JSONObject.parseObject(section.getString(queIt.next()), Object.class); String userAnswer = question.getString("answer"); String userScore = question.getString("userScore"); lasChoiceRecord.setQuestionId(question.getString("qId")); lasChoiceRecord.setRecordId(UUID.randomUUID().toString()); eLearningChoiceRecordDao.save(lasChoiceRecord); }