String轉成JSON的實現
阿新 • • 發佈:2018-11-23
String轉成JSON
這個依賴很重要,我們將圍繞fastjson中的JSONObject這個類來談轉換
歡迎工作一到八年的Java工程師朋友們加入Java高階交流群:854630135
本群提供免費的學習指導 架構資料 以及免費的解答
不懂得問題都可以在本群提出來 之後還會有直播平臺和講師直接交流噢
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency>
- String轉成JSON
String json = "{"abc":"1","hahah":"2"}"; JSONObject jsonObject = JSONObject.parseObject(content); 一句話就能解決,非常便捷。 想要取出值,可以對`jsonObject`進行操作: jsonObject.getString("abc"); 結果為:`1`
- 將String轉為list後轉為JSON
List<String> list = new ArrayList<String>(); list.add("username"); list.add("age"); list.add("sex"); JSONArray array = new JSONArray(); array.add(list);
- 將String轉為map後轉為JSON
Map<String, String> map = new HashMap<String, String>(); map.put("abc", "abc"); map.put("def", "efg"); JSONArray array_test = new JSONArray(); 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,可仿照如下形式: JSONObject userJson = JSONObject.parseObject(jsonObject.getString("userAnswer")); 但是想獲取key"28568"就沒這麼容易了。直接像上述的寫法,會報錯。 我們瀏覽fastjson中的原始碼,總結下,應該如下寫: JSONObject question = (JSONObject) JSONObject.parseObject(section.getString("28568"), Object.class);
整體程式碼:
dao程式碼很容易,就不貼出來了。 package com.xiamenair.training.business.service; import com.alibaba.fastjson.JSONObject; import com.xiamenair.training.business.dao.elearningdao.ELearningExamInstanceDao; import com.xiamenair.training.business.dao.masterdao.ELearningChoiceRecordDao; import com.xiamenair.training.business.model.LasChoiceRecord; import com.xiamenair.training.business.model.entity.elearning.LasExamInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.sql.Blob; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.*; @Service public class ChoiceRecordService { //查詢資料Dao @Autowired private ELearningChoiceRecordDao eLearningChoiceRecordDao; //轉儲資料Dao @Autowired private ELearningExamInstanceDao eLearningExamInstanceDao; private ChoiceRecordService() { } private static class SingletonRecordInstance { private static final LasChoiceRecord choiceRecord = new LasChoiceRecord(); } public static LasChoiceRecord getMapInstance() { return SingletonRecordInstance.choiceRecord; } private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); /** * 定時任務,每天定時將E學網考試資料分析並轉儲 * * @param : instanceIdList * @return : void * @author : 28370·皮育才 * @date : 2018/11/20 **/ @Scheduled(cron = "00 00 01 * * ?") public void analysisChoiceRecord() { //獲取前一天的時間 Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(calendar.DATE, -1); date = calendar.getTime(); String dateString = simpleDateFormat.format(date); List<BigDecimal> 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 = new String(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<String> setIt = sectionSet.iterator(); analyzeAnswer(lasChoiceRecord, userJson, setIt); }); } } private void analyzeAnswer(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<String> 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); } } } }