簡體   English   中英

為什么JSON很重要?

[英]Why is JSON important?

我最近才聽說過JSON(Javascript Object Notation)。 任何人都可以解釋為什么(某些網站/博客/等)被認為是重要的? 我們已經有了XML,為什么JSON更好(除了'原生於Javascript')?

編輯:嗯,主要答案主題似乎是'它更小'。 但是,它允許跨域提取數據這一事實對我來說似乎很重要。 或者這在實踐中是否(尚未)使用得多?

XML有幾個缺點:

  • 它很重!
  • 它提供了內容的分層表示,與Javascript對象模型不完全相同(但非常相似)。
  • Javascript隨處可用。 沒有任何外部解析器,您可以直接使用JS解釋器處理JSON。

顯然,它並不意味着完全取代XML。 對於基於JS的Web應用程序,其優勢可能很有用。

JSON通常比其XML等價物小得多。 較小的傳輸意味着更快的傳輸,從而帶來更好的用戶體驗。

JSON更簡潔。 XML:

<person>
    <name>John Doe</name>
    <tags>
        <tag>friend</tag>
        <tag>male</tag>
   </tags>
</person>

JSON:

{"name": "John Doe", "tags": ["friend", "male"]}

重疊功能也較少。 例如,在XML中,選擇使用元素(如上所述)與屬性( <person name="John Doe"> )之間存在緊張關系。

JSON開始流行使用主要是因為它提供了一種繞過Web瀏覽器中使用的同源策略從而允許mashup的方法。

假設您正在域A上編寫Web服務。您無法從域B加載XML數據並解析它,因為唯一的方法是XMLHttpRequest,而XMLHttpRequest最初受限於同源策略的談話僅包含與包含頁面在同一域中的URL。

事實證明,對於各種各樣的原因, 允許請求<SCRIPT>跨源標簽。 聰明的人意識到這是解決XMLHttpRequest限制的好方法。 它可以返回一系列JavaScript對象和數組文字,而不是服務器返回XML。

(獎金問題留給讀者一個練習:為什么<script src =“...”>允許跨域沒有服務器選擇加入,但XHR不是?)

當然,返回一個只包含對象文字的<script>是沒有用的,因為如果不將值賦給某個​​變量,就不能對它做任何事情。 因此,大多數服務使用JSON的變體,稱為JSONP( http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ )。

隨着mashup的普及,人們意識到JSON是一種方便的數據交換格式,特別是當JavaScript是頻道的一端時。 例如,JSON在Chromium中廣泛使用,即使在雙方都使用C ++的情況下也是如此。 它只是表示簡單數據的一種很好的輕量級方法,在許多語言中都存在很好的解析器。

有趣的是,使用<script>標簽進行mashup是非常不安全的,因為它本質上是XSS自己的目的。 因此必須引入原生JSON( http://ejohn.org/blog/native-json-support-is-required/ ),這樣可以避免格式的原始優勢。 但到那個時候,它已經超人氣了:)

如果您使用的是Javascript,那么我們JSON就容易多了。 這是因為JSON可以直接評估為Javascript對象,這比DOM更容易使用。

借用並稍微改變上面的XML和JSON

XML:

<person>
    <name>John Doe</name>
    <tag>friend</tag>
    <tag>male</tag>
</person>

JSON:

{ person: {"name": "John Doe", "tag": ["friend", "male"]} }

如果你想用XML獲取第二個標記對象,你需要使用強大但冗長的DOM apis:

var tag2=xmlObj.getElementsByTagName("person")[0].getElementsByTagName("tag")[1];

使用通過JSON引入的Javascript對象,您可以簡單地使用:

var tag2=jsonObj.person.tag[1];

當然,Jquery使DOM示例更簡單:

var tag2=$("person tag",xmlObj).get(1);

但是,JSON只是“適合”Javascript世界。 如果你使用它一段時間,你會發現你的心理開銷比涉及基於XML的數據少得多。

所有上述示例都忽略了一個或多個節點可用,重復或節點只有一個或沒有子節點的可能性。 但是,為了說明JSON的本機,要使用jsonObj執行此操作,您只需:

var tag2=(jsonObj.person && jsonObj.person.tags && jsonObj.person.tags.sort && jsonObj.person.tags.length==2 ? jsonObj.person.tags[1] : null);

(有些人可能不喜歡那么長的三元,但它確實有效)。 但是XML(在我看來)會更糟糕(我認為你不想采用三元方法,因為你會繼續調用dom方法,這可能需要根據實現再次完成工作):

var tag2=null;
var persons=xmlObj.getElementsByTagName("person");
if(persons.length==1) {
    var tags=persons[0].getElementsByTagName("tag");
    if(tags.length==2) { tag2=tags[1]; }
}

Jquery(未經測試):

var tag2=$("person:only-child tag:nth-child(1)",xmlObj).get(0);

這取決於你要做什么。 這里有很多答案,更喜歡JSON而不是XML。 如果你深入了解一下,沒有太大的區別。

如果你有一個對象樹,你只能得到一個javascript對象樹。 如果你看一下使用OOP風格訪問的緊張情緒,而不是回頭看你。 假設您有一個在樹中構造的類型為A,B,C的對象。 您可以輕松地將它們序列化為JSON。 如果你再讀回來,你只會獲得一個javascript對象樹。 要重建你的A,B,C,你必須手動將值填充到手動創建的對象中,或者你做一些黑客攻擊。 聽起來像解析XML和創建對象? 嗯,是 :)

目前,只有最新的瀏覽器才能獲得JSON的原生支持。 要支持更多瀏覽器,您有兩種選擇:a)在javascript中加載json paraser以幫助您解析。 那么,這有關於肥胖的聲音有多胖? 我經常看到的另一個選項是eval。 您可以在JSON String上執行eval()來獲取對象。 但這引入了一整套新的安全問題。 指定了JSON,因此它不能包含函數。 如果您沒有檢查對象的功能,則可以輕松地向您發送正在執行的代碼。

所以它可能取決於你更喜歡什么:JSON或XML。 最大的區別可能是訪問事物的方式,無論是腳本標簽XMLHTTPRequest ......我會決定使用什么。 在我看來,如果在瀏覽器中有適當的XPATH支持,我會經常決定使用XML。 但是時尚是針對json並在javascript中加載其他json解析器。

如果你無法決定並且你知道你需要一些非常強大的東西,你必須看看YAML。 閱讀有關YAML的內容非常有趣,可以更深入地了解該主題。 但這實際上取決於你想要做什么。

JSON是一種在Javascript對象中序列化數據的方法。 語法取自語言,因此對於處理Javascript的開發人員來說應該很熟悉,並且 - 作為對象的字符串化 - 它是一種更自然的序列化方法,用於在瀏覽器中進行交互而不是完整的XML派生(所有任意設計決定暗示)。

它輕巧而直觀。

JSON是一種基於文本的對象序列化格式,它比XML更輕量級,並且直接與JavaScript的對象模型集成。 這就是它的大部分優勢。

它的缺點(與XML相比)大致是:可用工具更少(忘記標准驗證和/或轉換,更不用說大多數編輯器中的語法突出顯示或格式良好檢查),不太可能是人類可讀的(有很大的可用性) JSON和XML的可讀性差異,因此這是一個必然的模糊語句),與JavaScript的緊密集成使得與其他環境的集成不那么緊密。

它不是更好,但它可以將許多東西聯系在一起,無需手動解析即可實現無縫數據傳輸!

例如javascript - > C#web service - > javascript

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM