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}
類型轉換
- 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("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