且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JSON 模式(Schema)与数据解析

更新时间:2022-04-16 04:35:36

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()这个方法就行了