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}
型別轉換
- Json字串——>JS物件,使用方法:
obj = JSON.parse(json_str);
obj = jQuery.parseJSON(json_str);
注意:傳入畸形json字串(例如:'{name:"xiao",age:12}'),會丟擲異常;
Json字串格式,嚴格格式:'{"name":"xiao","age":12}'
- 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()這個方法就行了