JSON 模式(Schema)与数据解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: JSON 模式是一种基于 JSON 格式定义 JSON 数据结构的规范 JSON 模式用于描述现有数据格式,干净的人类和机器可读的文档,完整的结构验证,有利于自动化测试,可用于验证客户端提交的数据

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

目录
相关文章
|
12天前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
128 83
|
21天前
|
数据可视化 算法 数据挖掘
用傅里叶变换解码时间序列:从频域视角解析季节性模式
本文介绍了如何使用傅里叶变换和周期图分析来识别时间序列中的季节性模式,特别是在能源消耗数据中。通过Python实现傅里叶变换和周期图,可以有效提取并量化时间序列中的主要和次要频率成分,克服传统可视化分析的局限性。这对于准确捕捉时间序列中的季节性变化具有重要意义。文章以AEP能源消耗数据为例,展示了如何应用这些方法识别日、周、半年等周期模式。
61 3
用傅里叶变换解码时间序列:从频域视角解析季节性模式
|
2月前
|
存储 搜索推荐 大数据
数据大爆炸:解析大数据的起源及其对未来的启示
数据大爆炸:解析大数据的起源及其对未来的启示
124 15
数据大爆炸:解析大数据的起源及其对未来的启示
|
12天前
|
数据采集 Web App开发 存储
深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作
本文介绍了基于无界面浏览器(如ChromeDriver)和代理IP技术的现代爬虫解决方案,以应对传统爬虫面临的反爬机制和动态加载内容等问题。通过Selenium驱动ChromeDriver,并结合亿牛云爬虫代理、自定义Cookie和User-Agent设置,实现高效的数据采集。代码示例展示了如何配置ChromeDriver、处理代理认证、添加Cookie及捕获异常,确保爬虫稳定运行。性能对比显示,Headless模式下的ChromeDriver在数据采集成功率、响应时间和反爬规避能力上显著优于传统爬虫。该方案广泛应用于电商、金融和新闻媒体等行业。
深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作
|
20天前
|
数据采集 前端开发 API
SurfGen爬虫:解析HTML与提取关键数据
SurfGen爬虫:解析HTML与提取关键数据
|
26天前
|
数据采集 监控 搜索推荐
深度解析淘宝商品详情API接口:解锁电商数据新维度,驱动业务增长
淘宝商品详情API接口,是淘宝开放平台为第三方开发者提供的一套用于获取淘宝、天猫等电商平台商品详细信息的应用程序接口。该接口涵盖了商品的基本信息(如标题、价格、图片)、属性参数、库存状况、销量评价、物流信息等,是电商企业实现商品管理、市场分析、营销策略制定等功能的得力助手。
|
4天前
|
存储 数据采集 JSON
Python爬取某云热歌榜:解析动态加载的歌曲数据
Python爬取某云热歌榜:解析动态加载的歌曲数据
|
5天前
|
JSON JavaScript 前端开发
处理从API返回的JSON数据时返回Unicode编码字符串怎么处理
在处理API返回的JSON数据时,遇到类似`\u7f51\u7edc\u8fde\u63a5\u9519\u8bef`的Unicode编码字符串,可使用JavaScript内置方法转换为可读文字。主要方法包括:1. 使用`JSON.parse`自动解析;2. 使用`decodeURIComponent`和`escape`组合解码;3. 在API调用中直接处理响应数据。这些方法能有效处理多语言内容,确保正确显示非ASCII字符。
|
10天前
|
JSON API 数据格式
淘宝商品评论数据API接口详解及JSON示例返回
淘宝商品评论数据API接口是淘宝开放平台提供的一项服务,旨在帮助开发者通过编程方式获取淘宝商品的评论数据。这些数据包括评论内容、评论时间、评论者信息、评分等,对于电商分析、用户行为研究、竞品分析等领域都具有极高的价值。
|
2月前
|
CDN
阿里云CDN怎么收费?看这一篇就够了,CDN不同计费模式收费价格全解析
阿里云CDN的费用由基础费用和增值费用组成。基础费用有三种计费方式:按流量、按带宽峰值和月结95带宽峰值,默认为按流量计费,价格根据使用量阶梯递减。增值费用包括静态HTTPS请求、QUIC请求等,按实际使用量收费,不使用不收费。具体收费标准和详细规则可参考阿里云官方页面。

热门文章

最新文章

推荐镜像

更多