天天看點

詳解電子表格中的json資料:序列化與反序列化

當下應用開發常見的B/S架構之下,我們會遇到很多需要進行前後端資料傳輸的場景。而在這個傳輸的過程中,資料通過何種格式傳輸、方式是否迅速便捷、書寫方式是否簡單易學,都成為了程式員在開發時要考量的問題。

在1996年,W3C(World Wide Web Consortium,網際網路聯盟)正式公布了XML1.0标準,

XML采用标準格式為基于Web的應用提供了一個統一進行資料描述和資料交換的标準,不同于HTML側重于解決:如何将檔案顯示在浏覽器中,XML更加側重于解決:如何将資料以結構化方式描述。

(需要注意的是,XML并不是一種程式設計語言,而是一種跨語言的資料格式。)

XML本身并不複雜,但是加上W3C制定的DTD、XSD、XPath、XSLT等二十多個标準之後,這個簡單的資料交換格式平白變得複雜了起來。程式員但凡遇到,隻能頭大。苦心孤詣研究大半個月,也不好輕言自己全部清楚了。

詳解電子表格中的json資料:序列化與反序列化

而此時,推動着技術前進的另一台蒸汽機也被點燃——Ajax技術開始流行,映襯出XML越來越不容忽視的缺點。XML得以實作是基于DOM樹,而DOM在各種浏覽器中的實作細節不盡相同,是以XML的跨浏覽器相容性并不好,這時需要一種新的資料負載格式內建到HTML頁面中,以滿足Ajax的要求。

終于,在XML誕生後的第八年——2002年,由Douglas Crockford開始使用JSON這種輕量級資料交換格式。

首條JSON資訊發出後,最讓人們驚訝的是,這并不是一個全新的資料格式,它就是JavaScript。

詳解電子表格中的json資料:序列化與反序列化

而由于這條資料内容本身就是JavaScript,是以不再需要做任何額外解析,使用JS編譯器就可以解決一切。

由于JSON非常簡單,很快就風靡Web世界,并且成為ECMA标準。幾乎所有程式設計語言都有解析JSON的庫,而在JavaScript中,我們可以直接使用JSON,因為JavaScript内置了JSON的解析。把JavaScript對象變成JSON,就是把這個對象序列化成一個JSON格式的字元串,這樣才能夠通過網絡傳遞給其他計算機。如果我們收到一個JSON格式的字元串,隻需要把它反序列化成一個JavaScript對象,就可以在JavaScript中直接使用這個對象了。

正如一道菜做好後,需要裝在盤子裡端給顧客,前後端的資料傳輸也是如此。資料通過指定格式,将傳輸的對象序列化為二進制資料流,然後再通過反序列化将資料流内容轉化成為對應的資料對象。

詳解電子表格中的json資料:序列化與反序列化

在JSON中,資料有以下幾種形式:

對象:一個沒有順序的"鍵/值",格式如

詳解電子表格中的json資料:序列化與反序列化

數組:用以設定數值順序,格式如

詳解電子表格中的json資料:序列化與反序列化

字元串:任意數量的Unicode字元,格式如

詳解電子表格中的json資料:序列化與反序列化

進行資料序列化和反序列化的方式有以下三種:

使用JavaScriptSerializer類

使用DataContractJsonSerializer類

使用JSON.NET類庫

以JavaScriptSerializer類為例,

隻需要調用對應方法,就可以直接實作對資料内容的序列化。

你以為到這裡就結束了嗎,當然沒有。在實際應用中,資料本身的處理并沒有什麼難度,真正需要考慮解決的問題是,資料本身附加的屬性、設定。就以我們自身為例,客戶在純前端電子表格中對JSON資料傳輸的真實需求是,這段資料需要保證所有可視化内容的完整傳輸。

在實際處理使用者需求時,使用者在設定好如下圖單元格後,不僅僅是單元格記憶體在數字,還會遇到單元格本身的樣式、自定義函數、 自定義格式、自定義函數迷你圖、自定義标簽,以及自定義行篩選。

詳解電子表格中的json資料:序列化與反序列化

我們打開相關的代碼,可以清楚地看到在格式中這些對單元格的設定,都被儲存了下來。

詳解電子表格中的json資料:序列化與反序列化
詳解電子表格中的json資料:序列化與反序列化

在這個圖中,我們可以看到不同類型的資料内容都可以完成序列化和反序列化的過程。在使用自定義序列化的過程中,檢視相關代碼,處理序列化的核心是typeName 字段在調用toJSON函數的過程,比如,可以将此類姓名和window對象聯系。而反序列化時,調用 getTypeFromString 函數來擷取類型名并且構造類型執行個體對象,然後調用類型執行個體上的 fromJSON方法。

詳解電子表格中的json資料:序列化與反序列化

此外還有許多其他的屬性内容,下面列舉其他樣式設定的例子:

背景圖檔:

水印設定:

主題字型:

還有許多對于單元格的設定,這些樣式内容都可以被完整儲存下來,作為json資料進行傳輸,帶來真正的表格json資料傳輸的便利。

使用過程中需要注意以下問題:

給 typeName 字段設定完整的類型名字元串(如果有命名空間也應包含命名空間)。

如果自定義類型有循環依賴或是你希望減小JSON 資料的大小,亦或是你有其他更進階的需求,那麼你的自定義類型需要重寫toJSON和fromJSON方法。

如果自定義類型定義在一個閉包中,換句話說,你不希望将自定義類型定義在 window 對象上,你需要重寫 getTypeFromString 函數來手動解析類型的字元串。

代碼示例:

本文詳細為大家介紹了資料傳輸從XML到JSON的故事,以及json進行序列化和反序列化的工作原理,同時帶大家了解了在前端電子表格中要想完全實作整個内容的資料序列化和反序列化應該如何做。

詳解電子表格中的json資料:序列化與反序列化

後續也會為大家帶來更多有趣或者嚴肅的内容~

覺得不錯,點個贊再走吧。

本文是由葡萄城技術開發團隊釋出,轉載請注明出處:葡萄城官網