JSON 模式(Schema)与数据解析

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
云解析 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()这个方法就行了

目录
相关文章
|
6天前
|
数据采集 存储 JavaScript
如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取
在现代网页开发中,复杂的HTML结构给爬虫技术带来挑战。传统的解析库难以应对,而Cheerio和jsdom在Node.js环境下提供了强大工具。本文探讨如何在复杂HTML结构中精确提取数据,结合代理IP、cookie、user-agent设置及多线程技术,提升数据采集的效率和准确性。通过具体示例代码,展示如何使用Cheerio和jsdom解析HTML,并进行数据归类和统计。这种方法适用于处理大量分类数据的爬虫任务,帮助开发者轻松实现高效的数据提取。
如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取
|
7天前
|
XML JSON API
淘宝京东商品详情数据解析,API接口系列
淘宝商品详情数据包括多个方面,如商品标题、价格、图片、描述、属性、SKU(库存量单位)库存、视频等。这些数据对于买家了解商品详情以及卖家管理商品都至关重要。
|
1天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
11 0
|
8天前
|
监控 安全 网络安全
|
8天前
|
开发者 云计算 数据库
从桌面跃升至云端的华丽转身:深入解析如何运用WinForms与Azure的强大组合,解锁传统应用向现代化分布式系统演变的秘密,实现性能与安全性的双重飞跃——你不可不知的开发新模式
【8月更文挑战第31天】在数字化转型浪潮中,传统桌面应用面临新挑战。本文探讨如何融合Windows Forms(WinForms)与Microsoft Azure,助力应用向云端转型。通过Azure的虚拟机、容器及无服务器计算,可轻松解决性能瓶颈,满足全球用户需求。文中还提供了连接Azure数据库的示例代码,并介绍了集成Azure Storage和Functions的方法。尽管存在安全性、网络延迟及成本等问题,但合理设计架构可有效应对,帮助开发者构建高效可靠的现代应用。
12 0
|
9天前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
23 0
|
9天前
|
开发者 Java
JSF EL 表达式:乘技术潮流之风,筑简洁开发之梦,触动开发者心弦的强大语言
【8月更文挑战第31天】JavaServer Faces (JSF) 的表达式语言 (EL) 是一种强大的工具,允许开发者在 JSF 页面和后台 bean 间进行简洁高效的数据绑定。本文介绍了 JSF EL 的基本概念及使用技巧,包括访问 bean 属性和方法、数据绑定、内置对象使用、条件判断和循环等,并分享了最佳实践建议,帮助提升开发效率和代码质量。
19 0
|
9天前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
15 0
|
9天前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
19 0
|
9天前
|
开发者 监控 开发工具
如何将JSF应用送上云端?揭秘在Google Cloud Platform上部署JSF应用的神秘步骤
【8月更文挑战第31天】本文详细介绍如何在Google Cloud Platform (GCP) 上部署JavaServer Faces (JSF) 应用。首先,确保已准备好JSF应用并通过Maven构建WAR包。接着,使用Google Cloud SDK登录并配置GCP环境。然后,创建`app.yaml`文件以配置Google App Engine,并使用`gcloud app deploy`命令完成部署。最后,通过`gcloud app browse`访问应用,并利用GCP的监控和日志服务进行管理和故障排查。整个过程简单高效,帮助开发者轻松部署和管理JSF应用。
24 0

热门文章

最新文章

推荐镜像

更多