JSON 模式(Schema)与数据解析

本文介绍了JSON模式的概念及其在描述和验证数据结构中的作用,并详细解释了如何使用JSON模式进行数据验证。此外,还对比了JSON与XML的区别,并探讨了JSON数据在不同场景下的解析方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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关于模式的描述
typetype 关键字在我们的 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()这个方法就行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值