Android 開發中為什麼很少使用 JSON 存儲數據?

如題,許多 app 喜歡使用 SQLite 或 XML 存儲用戶的偏好設置或一些其他數據。然而對於一些輕量的數據,我認為完全沒有必要用 SQLite,比如 Launcher 的圖標布局。JSON 是一種十分輕量級的數據格式,而且 Android 開發中,解析和 stringify 都十分方便,為什麼很少有人用呢?


估計樓主想問的是,為什麼做本地儲存數據時,很多人存到SQLite里,或者存成xml文件,而不是json的字元串文本。

簡單的數據儲存是沒必要用SQLite。

有些需要「查」的,那就還是要用SQLite了。xml和json都無法替代sql的select功能。

我覺得也有一部分原因是android程序員一般都是從其他程序員轉成android。數據儲存已經習慣用sql了。

至於xml,android默認的sharedpreference存起來就是xml,用起來簡單。json也是要解析的嘛,簡單的數據,用起來哪有sharedpreference方便?

至於說序列化之後儲存,我沒有試過和json解析比哪個更有效率。但是我覺得應該序列化效率會更高一些吧。


看有人拿 XML 和 JSON 做比較,順便補一點:

XML 是「文檔標記語言」,而 JSON 是「數據交互語言」,XML 比起 JSON 描述能力要強,所以在描述複雜文檔的時候會選用 XML(例如 Layout 文件)。但是 JSON 比 XML 更為 Human readable、更易編寫,也對機器更為友好,所以用 JSON 來儲存一些簡單的配置是比 XML 要好用得多的(例如大家都知道的 Shadowsocks 就是使用 JSON 進行應用配置)。但是 JSON 天生描述能力不強,它擅長的是描述數據,而非文檔(配置其實也是文檔的一種),所以稍微複雜的文檔是不會使用 JSON 來描述,這也就是為什麼會衍生出 YAML、TOML 一類語言的原因(拒絕擁抱 XML 的後果)。

===

SharedPreferences 是一整套東西啊,PreferencesActivity 也依賴於它。所以對實現 APP 偏好設置來說,它就是「最方便的實現」,你不用關心它底層是用數據結構去儲存的,只是 Android 選擇用 XML 去描述而已。

而 SQLite 是關係資料庫,數據間有較複雜關係的,操作需要用到複雜的增刪改查,無疑使用 SQLite 是最好的方案。

而題主說的一些輕量的數據,確實是持久化為文件更方便。如果是儲存 用戶偏好設置 還是用 SharedPreferences 來解決方便多了,無需接觸到數據格式。如果並非面向用戶,而是面嚮應用或面向開發者的話(例如一些 應用配置、常用數據),JSON 是不錯的選擇,畢竟 JSON 比起 XML 來說更易閱讀與調試。

當然 JSON 也不是唯一選擇,應用配置的話用 YAML 或 TOML 更好(更強的描述能力,更少冗餘),只不過 JSON 應用更廣泛罷了。


沒有行不行的場景,只有合不合適的場景。

首先,使用 JSON 來存儲數據是有場景的。不過場景大多限於配置的存儲,例如 iOS 的 xcassets、Content Blocker Extension 的配置就是 JSON。用 XML 來存儲的就更多,Storyboard 和 Plist 就是 XML。

另外在有一些方案裡面會把 JSON 序列化後存起來,比如 iOS 裡面把 JSON 的數據序列化後存在 KeyValue 查詢的組件裡面去。

但是對於經常要做 行更新 的數據,用 JSON 顯然是不合適的,對於一些更複雜的查詢和更新,JSON 也不合適。

最後,對於輕量級的配置存儲,iOS 和 Android 都提供了解決方案,只是 iOS 的 NSUserDefaults 和 Android 的 SharedPreferences 在存儲的時候選擇了 XML 而已。

JSON 的定位是 一種輕量級的 數據交換 格式。


用於交換的數據格式你非要拿來做存儲


一些app確實會用SQLite存儲配置信息(如騰訊新聞,QQ,淘寶等)

JSON確實是一種非常清爽的數據交換格式

也有很多應用用SharedPreferences作為配置信息存儲(即你說的xml)

為什麼不用JSON?什麼情況下用JSON存儲有優點?

首先SQLite是資料庫,資料庫意味著你可以建立很多個資料庫,一個資料庫可以建很多個表,當一個項目龐大到需要多個資料庫和幾十上百張表來支撐的時候,你本地需要緩存或者存儲的配置信息就不是JSON能完成的了的任務了

why?

因為資料庫我可以對它進行設計,按照我要的格式來搭建,我可以隨時新增一條數據,查詢一條數據,刪除一條數據,這體現了什麼?有非常強大的操作性,JSON呢?JSON我只能先按照JSON的結構解析的對象,然後再對它進行操作,可以說這是正常客戶端服務端傳輸的逆向操作

正常服務端到客戶端:資料庫 — 對象 — JSON — 客戶端 — 對象 — 使用

JSON你不能對它進行結構設計,正常的流程是設計好的資料庫結構查詢出結果的對象轉成對應的JSON,資料庫是存儲數據的,JSON是交換傳輸對象的,這兩者沒有可比性

對於你說的JSON存儲對象我並非不理解你的意思,你是指將配置信息對象轉成對象作為文本存儲,然後需要的時候再讀取string?(其中一種方式吧), 那就意味著你只能對它進行讀取,不能修改,修改也只局限於覆蓋,因為Android並沒有對應的api/也沒用第三方SDK可以對JSON進行結構/數據修改,那也就意味著這個配置信息很死了

那SharedPreferences呢?XML是描述性語言(可擴展標記),據我所知有一種鋼琴譜的格式叫MusicXML,其就是XML數據格式,可讀性操作性都很強,要不然怎麼說其具有描述性?SharedPreferences本身就有一套方案供你對它的配置信息進行讀取修改增加,你並不需要去理會它怎麼操作的,你只需要知道你可以添加配置可以查詢配置可以刪除配置而這一切都有現成的函數供你耍就行了,也就是它雖然不能像資料庫那樣設計結構(本身性質也不一樣),但是對於配置信息的存儲很明顯已經達標了,而JSON,明顯不達標

除非,哪天我寫出了一套方案可以供你對它進行增刪改查

另外,SharedPreferences非常不安全,幾乎裸奔,如果你不對數據進行加密,也只能存儲配置了

最後回答一下我最開始的第二個問題,什麼時候可以用JSON作為配置信息存儲?

很明顯,當它只是一個配置並且對象結構不會改變的時候(保證應用程序在解析的時候不會拋異常),只需要拿來操就行了,final config


選擇數據格式需要看具體場景。

存儲簡單的配置類信息,用 XML/JSON/YAML等都可以,解析和讀寫在技術上都沒太大問題。但貌似用 XML 的多一些?

存儲較複雜的關係型的數據,肯定得選擇 SQLite,這個 Android 和 iOS 都支持。

說了存儲,再說傳輸。

傳輸格式分兩類:文本格式和二進位格式。

文本格式以 XML/JSON 為代表,特點是可讀性強,但是傳輸效率低(尤其是XML的成對標籤)。而這兩者中,JSON 無疑在平衡可讀性和傳輸效率上做得更好。

二進位格式以 ProtocolBuffer 為代表,特點是傳輸效率高(幾乎沒有冗餘信息),解析效率高(協議固定,直接從指定位開始讀取,不需要做字元串查找和匹配),安全性好(二進位天然加密,當然某種程度上講可讀性差,調試稍麻煩),缺點是靈活性差,除了可以設置欄位是否 optional 外,幾乎沒有靈活性可言,欄位順序都是固定死的。


還真有,我就是,不僅用接送傳輸數據,也保存json格式字元串在本地做存儲。

場景一:Sqlite 中 比較確定部份、 查詢語句用到的欄位作為列,其它部分使用json格式字元串存儲信息

這樣目的 就是擴展性稍好,新增加的欄位老版本也能保存,客戶端升級就能解析使用,資料庫不用變更

場景二:其它的信息 比如用戶信息,配置,或者數據緩存,就直接json字元串存在sharedPreference裡面了

就是省事 代碼就一套解析json的就好

我去 仔細看了一下題,是要替換sqlite啊,題主沒有遇到數據量大的應用吧,比如上千張圖片的相冊應用,詞典之類的。


json主要是用來和伺服器進行信息傳遞方便,做本地固化存儲並不方便查詢和插入...


Java 是靜態語言,靜態語言下解析 XML 比 JSON 更適合


輕量級的數據存儲確實沒有必要使用SQLite,但是使用SQLite資料庫的目的在於可以非常方便地進行增刪查改。而使用XML和JSON都很難做到。

再說XML和JSON。XML是一種文本標記語言,其描述能力很強,一般可以用來存儲數據非常方便。而JSON相比XML,少了很多的冗餘標籤,因此JSON更加適合用於數據傳輸,而少有用JSON做數據存儲的。


問題是你把儲存的json字元串放在哪?不還得是sqlite嗎?還是我太無知了,有一種文件格式叫json?


json和數據相差的只是一個搜索的資料庫語言而已。假設我現在有了json文件d的數據,同時我也有操作json格式的文件的語言,假設以後會有一個js引擎,可以直接操作json數據,並且效率非常高,那麼,增刪改查都有可能了。


json在做本地緩存比較便利 也就是不涉及到改和查的情況下 效率和開發難度都比較好(也可以直接序列號jsonbean對象) 但涉及改和查的時候還是要資料庫了


JSON是數據交換格式,XML是可擴展標記語言,標準通用標記語言的子集,是一種用於標記電子文件使其具有結構性的標記語言。

兩種定義就不一樣,最初JSON就是JavaScript語言的一個子集,現在獨立成一種輕量數據交換格式。NodeJS流行後,JSON才開始經常用來書寫配置文件。 而XML最初設計的就是為了結構化存儲數據的語言。


推薦閱讀:

如何從零寫一個kv資料庫?
區塊鏈和分散式資料庫有什麼本質不同?
設計的時候,如果去掉外鍵關聯,postgresql和mysql,哪個更有優勢?
為什麼新的分散式資料庫又開始支持關係模型了?
適合初學者學習資料庫的書有哪些較好的?

TAG:資料庫 | Android開發 | SQLite | JSON |