JSON作爲一種輕量級的數據交換格式,通常採用完全獨立於編程語言的文本格式來存儲和表示數據。它的層次結構簡潔清晰,易於人們的閱讀和編寫,此外機器編寫和生成也會變得容易,可以有效地提升網絡傳輸效率,這些因素使得JSON成爲理想的數據交換語言。
由於JSON的使用方式十分簡單,這個方便的傳輸形式很快就風靡Web世界,並且成爲ECMA標準。幾乎所有編程語言都有解析JSON的庫,而在JavaScript中,我們可以直接使用JSON,因爲JavaScript內置了JSON的解析。把JavaScript對象變成JSON,就是把這個對象序列化成一個JSON格式的字符串,這樣才能夠通過網絡傳遞給其他計算機。如果我們收到一個JSON格式的字符串,只需要把它反序列化成一個JavaScript對象,就可以在JavaScript中直接使用這個對象了。
JSON的使用
JSON 最常見的用法之一,是從 web 服務器上讀取 JSON 數據(作爲文件或作爲 HttpRequest),將 JSON 數據轉換爲 JavaScript 對象,然後在網頁中使用該數據。
創建包含 JSON 語法的 JavaScript 字符串:
var txt = '{ "employees" : [' +
'{ "firstName":"John" , "lastName":"Doe" },' +
'{ "firstName":"Anna" , "lastName":"Smith" },' +
'{ "firstName":"Peter" , "lastName":"Jones" } ]}';
由於 JSON 語法是 JavaScript 語法的子集,JavaScript 函數 eval() 可用於將 JSON 文本轉換爲 JavaScript 對象。
eval() 函數使用的是 JavaScript 編譯器,可解析 JSON 文本,然後生成 JavaScript 對象。必須把文本包圍在括號中,這樣才能避免語法錯誤:
var obj = eval ("(" + txt + ")");
除此之外的常用方法還有:
1、map轉換成json
JSONObject json = new JSONObject(map);
2、String轉換成json
JSONObject.parseObject(StringText)
3、List轉換成json
JSONArray json = new JSONArray(list);
4、json轉換成List
list = JSONObject.parseArray(list,String.class)
但其實我們在進行數據傳輸的時候,除了我們常見的數據如數組等格式之外,"時間"也是數據傳輸中的重要類型。
OADate的處理
有個玩笑說,企業數據化的盡頭的就是數據表格,數據表中重要的一項就是時間數據。
相信有用過日期格式並進行過json數據導出的小夥伴應該不難發現,當單元格的值是一個日期時,我們導出的日期數據會被儲存爲OADate。
(圖片來自網絡)
通常情況下我們使用OADate是爲了解決日期序列化以及時區問題,所以我們使用這種特殊的方式保存日期。但是很多情況下我們需要對日期數據進行一些處理,但是無奈的是不知如何進行轉換。
今天——它來了,它來了,葡萄帶着教程走來啦。
接下來我們來解決JSON日期格式數據處理問題,且針對不同編程環境都有解決方案。
首先我們來看前端。
function fromOADate(date) {
var oaDateReg = new RegExp('^/OADate\\(([-+]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)\\)/\\s*
);
if (typeof date === "string" && oaDateReg.test(date)) {
var oadate = parseFloat(date.match(oaDateReg)[1]);
var ms = (oadate * 86400000 * 1440 - 25569 * 86400000 * 1440 + new Date((oadate - 25569) * 86400000).getTimezoneOffset() * 86400000 ) / 1440;
return new Date(ms);
}else{
return date;
}
}
除了上述介紹的內容外,還有一個取巧的辦法就是通過tag進行一個轉換:
sheet.tag("/OADate(44542)/");
var date = sheet.tag();
後端java環境下:
long d = 44542;
double mantissa = d - (long) d;
double hour = mantissa*24;
double min =(hour - (long)hour) * 60;
double sec=(min- (long)min) * 60;
SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
Date baseDate = myFormat.parse("30 12 1899");
Calendar c = Calendar.getInstance();
c.setTime(baseDate);
c.add(Calendar.DATE,(int)d);
c.add(Calendar.HOUR,(int)hour);
c.add(Calendar.MINUTE,(int)min);
c.add(Calendar.SECOND,(int)sec);
System.out.println(c.getTime());
最後的,.net環境只需一句代碼就能搞定
System.DateTime.FromOADate(44542)
怎樣,學"廢"了嗎?
瞭解更多前端表格中的數據操作處理:https://demo.grapecity.com.cn/spreadjs/gc-sjs-samples/index.html?id=135