閱讀245 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JSON 模式(Schema)與數據解析

JSON 模式(Schema)

JSON 模式是一種基於 JSON 格式定義 JSON 數據結構的規範

JSON 模式用於描述現有數據格式,幹淨的人類和機器可讀的文檔,完整的結構驗證,有利於自動化測試,可用於驗證客戶端提交的數據

JSON 模式驗證庫

目前有好幾個驗證器可用於不同的編程語言。但是目前最完整和兼容 JSON 模式的驗證器是 JSV

JSON 模式示例

{
    "$schema": "https://json-schema.org/draft-04/schema#",
    "title": "Product",
    "description": "A product from Acme's catalog",
    "type": "object",
    "properties": {
        "id": {
            "description": "The unique identifier for a product",
            "type": "integer"
        },
        "name": {
            "description": "Name of the product",
            "type": "string"
        },
        "price": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        }
    },
    "required": ["id", "name", "price"] 
}

我們來看一下可以用於這一模式中的各種重要關鍵字:

關鍵字 描述
$schema $schema 關鍵字狀態,表示這個模式與 v4 規範草案書寫一致
title 用它給我們的模式提供了標題
description 關於模式的描述
type type 關鍵字在我們的 JSON 數據上定義了第一個約束:必須是一個 JSON 對象
properties 定義各種鍵和他們的值類型,以及用於 JSON 文件中的最小值和最大值
required 存放必要屬性列表
minimum 給值設置的約束條件,表示可以接受的最小值
exclusiveMinimum 如果存在 "exclusiveMinimum" 並且具有布爾值 true,如果它嚴格意義上大於 "minimum" 的值則實例有效
maximum 給值設置的約束條件,表示可以接受的最大值
exclusiveMaximum 如果存在 "exclusiveMinimum" 並且具有布爾值 true,如果它嚴格意義上小於 "maximum" 的值則實例有效
multipleOf 如果通過這個關鍵字的值分割實例的結果是一個數字則表示緊靠 "multipleOf" 的數字實例是有效的
maxLength 字符串實例字符的最大長度數值
minLength 字符串實例字符的最小長度數值
pattern 如果正則表達式匹配實例成功則字符串實例被認為是有效的

JSON 與 XML 對比

JSON 和 XML 都是人類可讀的格式並且與語言無關。在現實環境中它們都支持創建,讀取和解碼。我們可以基於以下因素來比較 JSON 和 XML:

冗餘度

XML 比 JSON 冗餘,因此對我們來說編寫 JSON 會更快

數組用法

XML 被用來描述結構化數據,不包含數組;而 JSON 包含數組。

解析

可以使用 JavaScript 的 eval 方法解析 JSON。當針對 JSON 應用這個方法時,eval 返回描述的對象。

JSON 示例

{
    "company": Volkswagen,
    "name": "Vento",
    "price": 800000
}

XML 示例

<car>
   <company>Volkswagen</company>
   <name>Vento</name>
   <price>800000</price>
</car>

JSON 數據解析

JSON 數據解析的方法

JSON是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 JSON采用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網絡傳輸速率)。

JSON的規則很簡單: 對象是一個無序的“‘名稱/值'對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值' 對”之間使用“,”(逗號)分隔

JSON提供了json.js包,將其引入然後就可以使用object.toJSONString()轉換成JSON數據

function showCar() {
    var carr = new Car("Dodge", "Coronet R/T", 1968, "yellow");
    alert(carr.toJSONString());
}
function Car(make, model, year, color) {
    this.make = make;
    this.model = model;
    this.year = year;
    this.color = color;
}

可以使用eval來轉換JSON字符到Object

function myEval() { 
    var str = '{ "name": "Violet", "occupation": "character" }'; 
    var obj = eval('(' + str + ')'); 
    alert(obj.toJSONString()); 
}

或者使用parseJSON()方法

function myEval() {
    var str = '{ "name": "Violet", "occupation": "character" }';
    var obj = str.parseJSON();
    alert(obj.toJSONString());
}

JS中json數據的處理

json數據結構(對象和數組)

json對象:var obj = {"name":"xiao","age":12};

json數組:var objArray = [{"name":"xiao","age":12},{"name":"xiao","age":12}];

處理json數據,依賴文件有:jQuery.js

數據傳輸過程中,json數據是以文本,即字符串格式形式存在;JS語言操作的是JS對象;所以json字符串與JS對象之間的轉換是關鍵;

數據格式

Json字符串:var json_str = '{"name":"xiao","age":12}';

Json對象:var obj = {"name":"xiao","age":12};

JS對象:Object {name: "xiao", age: 12}

類型轉換

  1. Json字符串——>JS對象,使用方法:

obj = JSON.parse(json_str);

obj = jQuery.parseJSON(json_str);

注意:傳入畸形json字符串(例如:'{name:"xiao",age:12}'),會拋出異常;

Json字符串格式,嚴格格式:'{"name":"xiao","age":12}'

  1. JS對象——>Json字符串:

json_str = JSON. stringify(obj);

eval()是JS原生函數,使用該形式:eval('('+'{name:"xiao",age:12}'+')'),並不安全,無法保證類型轉換為JS對象

JSON 數據解析

JSON格式在web開發中越來越受重視,特別是在使用ajax開發項目的過程中,經常需要將json格式的字符串返回到前端,前端解析成JS對象(JSON )

解析JSON數據的三種方法

eval()函數

對於服務器返回的JSON字符串,如果jquery異步請求沒做類型說明,或者以字符串方式接受,那麼需要做一次對象化處理,就是將該字符串放於eval()中執行一次。這種方式也適合以普通javascipt方式獲取json對象

function toJson(data){
    var json = eval('(' + data + ')');
    return json;
}

("("+data+")")原因:由於json是以”{}”的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理,所以必須強製性的將它轉換成一種表達式。加上圓括號的目的是迫使eval函數在處理JavaScript代碼的時候強製將括號內的表達式(expression)轉化為對象,而不是作為語句(statement)來執行

例如對象字麵量{},如若不加外層的括號,那麼eval會將大括號識別為JavaScript代碼塊的開始和結束標記,那麼{}將會被認為是執行了一句空語句。所以下麵兩個執行結果是不同的:

一般的js生成json對象,隻需要將$.each()方法替換為for語句即可,其他不變

對於服務器返回的JSON字符串,如果jquery異步請求將type(一般為這個配置屬性)設為“json”,或者利 用$.getJSON()方法獲得服務器返回,那麼就不需要eval()方法了,因為這時候得到的結果已經是json對象了,隻需直接調用該對象即可,這裏以$.getJSON方法為例說明數據處理方法:

$.getJSON("https://www.phpzixue.cn/",{param:"gaoyusi"},function(data){
    //此處返回的data已經是json對象
    $.each(data.root,function(idx,item){
        if(idx==0){            
            return true;//同countinue,返回false同break
        }
        alert("name:"+item.name+",value:"+item.value);
    });
});

該方法存在性能和安全方麵的問題,不建議使用

使用Function對象來完成

它的典型應用就是在JQuery中的AJAX方法下的success等對於返回數據data的解析

function toJson(str){
 var data = (new Function("return " + str))();
 return data;
}

此時的data就是一個json對象了

JSON.parse()方法

這種方法隻支持IE8/Firefox3.5+/Chrome4/Safari4/Opera10 以上版本,這些瀏覽器都已經接近W3C標準,默認實現了toJSON方法

function toJson(str){
 return JSON.parse(str);
}

最後更新:2017-05-17 11:32:58

  上一篇:go  一個很棒的介紹軟件測試的blog
  下一篇:go  Plug memory leaks in enterprise Java applications