1. 程式人生 > >JSON_模式(Schema)與資料解析

JSON_模式(Schema)與資料解析

JSON 模式(Schema)

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

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

JSON 模式驗證庫

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

JSON 模式示例

{
    "$schema": "http://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("http://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);
}

JS物件與JSON格式資料相互轉換

JS物件轉換成為JSON

流程:讀取前端頁面資料,組裝成為JS物件,並通過jQuery的$.post()方法傳遞給python。

處理:引用一個json2.js檔案,呼叫JSON.stringify()方法。例如:

var data = new Object(); 
var json_data = JSON.stringify(data); 

讀取:python這裡就很簡單了,用dict_data = json.loads(json_data)就OK了

JSON轉換成為JS

流程:python組裝一個dict資料並轉成JSON格式傳遞給前端,或者前端通過jQuery的$.getJSON()方法直接讀取這個JSON格式的資料

處理:用jQuery的一個方法$.parseJSON()將JSON格式的資料轉成JS物件。例如:

var json_data = $.getJSON(); 
var data = $.parseJSON(json_data);

讀取:JS對像的操作就不必多說了

這裡,python要把字典轉換成JSON格式資料,用json.dumps()這個方法就行了