String转成JSON
这个依赖很重要,我们将围绕fastjson中的JSONObject这个类来谈转换
1 <dependency> 2 <groupId>com.alibaba</groupId> 3 <artifactId>fastjson</artifactId> 4 <version>1.2.15</version> 5 </dependency>
String转成JSON
1 String json = "{"abc":"1","hahah":"2"}"; 2 JSONObject jsonObject = JSONObject.parseObject(content);
一句话就能解决,非常便捷。
想要取出值,可以对`jsonObject`进行操作:
jsonObject.getString("abc");
结果为:`1`
将String转为list后转为JSON
1 List<String> list = new ArrayList<String>(); 2 list.add("username"); 3 list.add("age"); 4 list.add("sex"); 5 JSONArray array = new JSONArray(); 6 array.add(list);
将String转为map后转为JSON
1 Map<String, String> map = new HashMap<String, String>(); 2 map.put("abc", "abc"); 3 map.put("def", "efg"); 4 JSONArray array_test = new JSONArray(); 5 array_test.add(map); 6 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,可仿照如下形式:
JSONObject userJson = JSONObject.parseObject(jsonObject.getString("userAnswer"));
但是想获取key"28568"就没这么容易了。直接像上述的写法,会报错。
我们浏览fastjson中的源码,总结下,应该如下写:
JSONObject question = (JSONObject) JSONObject.parseObject(section.getString("28568"), Object.class);
整体代码:
dao代码很容易,就不贴出来了。
1 package com.xiamenair.training.business.service; 2 import com.alibaba.fastjson.JSONObject; 3 import com.xiamenair.training.business.dao.elearningdao.ELearningExamInstanceDao; 4 import com.xiamenair.training.business.dao.masterdao.ELearningChoiceRecordDao; 5 import com.xiamenair.training.business.model.LasChoiceRecord; 6 import com.xiamenair.training.business.model.entity.elearning.LasExamInstance; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.scheduling.annotation.Scheduled; 9 import org.springframework.stereotype.Service; 10 import java.math.BigDecimal; 11 import java.sql.Blob; 12 import java.sql.SQLException; 13 import java.text.SimpleDateFormat; 14 import java.util.*; 15 @Service 16 public class ChoiceRecordService { 17 //查询数据Dao 18 @Autowired 19 private ELearningChoiceRecordDao eLearningChoiceRecordDao; 20 //转储数据Dao 21 @Autowired 22 private ELearningExamInstanceDao eLearningExamInstanceDao; 23 private ChoiceRecordService() { 24 } 25 private static class SingletonRecordInstance { 26 private static final LasChoiceRecord choiceRecord = new LasChoiceRecord(); 27 } 28 public static LasChoiceRecord getMapInstance() { 29 return SingletonRecordInstance.choiceRecord; 30 } 31 private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); 32 /** 33 * 定时任务,每天定时将E学网考试数据分析并转储 34 * 35 * @param : instanceIdList 36 * @return : void 37 * @author : 28370·皮育才 38 * @date : 2018/11/20 39 **/ 40 @Scheduled(cron = "00 00 01 * * ?") 41 public void analysisChoiceRecord() { 42 //获取前一天的时间 43 Date date = new Date(); 44 Calendar calendar = Calendar.getInstance(); 45 calendar.setTime(date); 46 calendar.add(calendar.DATE, -1); 47 date = calendar.getTime(); 48 String dateString = simpleDateFormat.format(date); 49 List<BigDecimal> instanceIdList = eLearningExamInstanceDao.findInstanceIdByFinishTime(dateString); 50 if(0 != instanceIdList.size()){ 51 LasChoiceRecord lasChoiceRecord = getMapInstance(); 52 instanceIdList.stream().forEach(instanceId -> { 53 Blob answerBlob = eLearningExamInstanceDao.findUserAnswer(instanceId); 54 Long userId = eLearningExamInstanceDao.findUserId(instanceId); 55 String content = null; 56 try { 57 content = new String(answerBlob.getBytes((long) 1, (int) answerBlob.length())); 58 } catch (SQLException e) { 59 e.printStackTrace(); 60 System.out.println("SQLEXCEPTION:" + e); 61 } 62 JSONObject jsonObject = JSONObject.parseObject(content); 63 //针对本section的"公共"属性直接设置 64 lasChoiceRecord.setUserId(userId); 65 lasChoiceRecord.setPaperType(jsonObject.getString("paperType")); 66 lasChoiceRecord.setPaperId(jsonObject.getString("paperOid")); 67 lasChoiceRecord.setExamInstanceId(jsonObject.getString("instanceId")); 68 lasChoiceRecord.setRemainingTime(jsonObject.getString("remainingTime")); 69 lasChoiceRecord.setExamId(jsonObject.getString("examOid")); 70 //针对section中的题目进行细化循环拆分 71 JSONObject userJson = JSONObject.parseObject(jsonObject.getString("userAnswer")); 72 Set sectionSet = userJson.keySet(); 73 Iterator<String> setIt = sectionSet.iterator(); 74 analyzeAnswer(lasChoiceRecord, userJson, setIt); 75 }); 76 } 77 } 78 private void analyzeAnswer(LasChoiceRecord lasChoiceRecord, JSONObject userJson, Iterator<String> setIt) { 79 while (setIt.hasNext()) { 80 //对每个question进行再次拆分出题目 81 JSONObject section = (JSONObject) JSONObject.parseObject(userJson.getString(setIt.next()), Object.class); 82 Set questionSet = section.keySet(); 83 Iterator<String> queIt = questionSet.iterator(); 84 while (queIt.hasNext()) { 85 JSONObject question = (JSONObject) JSONObject.parseObject(section.getString(queIt.next()), Object.class); 86 String userAnswer = question.getString("answer"); 87 String userScore = question.getString("userScore"); 88 lasChoiceRecord.setQuestionId(question.getString("qId")); 89 lasChoiceRecord.setRecordId(UUID.randomUUID().toString()); 90 eLearningChoiceRecordDao.save(lasChoiceRecord); 91 } 92 } 93 } 94 }