当前位置: 首页 > 编程日记 > 正文

区分json与jsonp

JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不是一回事儿,下边简单区分概括一下:

JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议。

我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是把用暗号书写的情报传递给自己同志时使用的接头方式。看到没?一个是描述信息的格式,一个是信息传递双方约定的方法。
  既然随便聊聊,那我们就不再采用教条的方式来讲述,而是把关注重心放在帮助开发人员理解是否应当选择使用以及如何使用上。

什么是JSON

前面简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,你是否该选用他首先肯定要关注它所拥有的优点。

JSON的优点:

  • 1、基于纯文本,跨平台传递极其简单;
  • 2、Javascript原生支持,后台语言几乎全部支持;
  • 3、轻量级数据格式,占用字符数量极少,特别适合互联网传递;
  • 4、可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的;
  • 5、容易编写和解析,当然前提是你要知道数据结构;   JSON的缺点当然也有,但在作者看来实在是无关紧要的东西,所以不再单独说明。

JSON的格式或者叫规则:   JSON能够以非常简单的方式来描述数据结构,XML能做的它都能做,因此在跨平台方面两者完全不分伯仲。

  • 1、JSON只有两种数据类型描述符,大括号{}和方括号[],其余英文冒号:是映射符,英文逗号,是分隔符,英文双引号""是定义符。
  • 2、大括号{}用来描述一组“不同类型的无序键值对集合”(每个键值对可以理解为OOP的属性描述),方括号[]用来描述一组“相同类型的有序数据集合”(可对应OOP的数组)。
  • 3、上述两种集合中若有多个子项,则通过英文逗号,进行分隔。
  • 4、键值对以英文冒号:进行分隔,并且建议键名都加上英文双引号”",以便于不同语言的解析。
  • 5、JSON内部常用数据类型无非就是字符串、数字、布尔、日期、null 这么几个,字符串必须用双引号引起来,其余的都不用,日期类型比较特殊,这里就不展开讲述了,只是建议如果客户端没 有按日期排序功能需求的话,那么把日期时间直接作为字符串传递就好,可以省去很多麻烦。

什么是JSONP

先说说JSONP是怎么产生的: 其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助。

  • 1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;
  • 2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<script>、、<iframe>);
  • 3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;
  • 4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;
  • 5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。
  • 6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。
  • 7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。 如果对于callback参数如何使用还有些模糊的话,我们后面会有具体的实例来讲解。

JSONP的客户端具体实现:

不管jQuery也好,ExtJs也罢,又或者是其他支持jsonp的框架,他们幕后所做的工作都是一样的,下面我来循序渐进的说明一下jsonp在客户端的实现:

    • 1、我们知道,哪怕跨域js文件中的代码(当然指符合web脚本安全策略的),web页面也是可以无条件执行的。
    • 2、现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。
    • 3、聪明的开发者很容易想到,只要服务端提供的js脚本是动态生成的就行了呗,这样调用者可以传一个参数过去告诉服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是服务器就可以按照客户端的需求来生成js脚本并响应了。
    • 4.到这里为止的话,相信你已经能够理解jsonp的客户端实现原理了吧?剩下的就是如何把代码封装一下,以便于与用户界面交互,从而实现多次和重复调用。

转载于:https://www.cnblogs.com/Scar007/p/7607569.html

相关文章:

通俗理解PCA降维作用

作者 | 黄礼泊&#xff0c;广东工业大学数据挖掘与信息检索实验室(DMIR)&#xff0c;机器学习与人工智能&#xff0c;目前研究方向最优化&#xff0c;将最优化理论运用在图像检索、压缩感知生物信号处理等领域。▌概述 本文主要介绍一种降维方法&#xff0c;PCA&#xff08;Pr…

windows和linux添加引导文件,Linux与Windows 10用grub引导教程-Go语言中文社区

前言去年暑假的时候&#xff0c;写了一篇如何装 Linux 和 Windows 10 双系统的文章发在了简书上&#xff0c;我写这篇文章的原因是当初装双系统确实是折腾了许久&#xff0c;网上也找不到一篇详尽的教程。由于去年对于写教程还不是熟练&#xff0c;而这一年多的使用过程也遇到了…

使用Apache对Tomcat进行负载均衡

翻译&#xff1a;疯狂的技术宅原文标题&#xff1a;Load balancing tomcat with Apache原文链接&#xff1a;http://programmergate.com/loa...本文首发微信公众号&#xff1a;充实的脑洞有时候我们需要把自己的应用部署在多个Tomcat实例上&#xff0c;这种场景通常是在使用大量…

linux数据库什么意思,Linux系统中的数据库命令是什么

Linux系统中难免会跟数据库打交道的时候&#xff0c;掌握数据库相关命令是很重要的。下面由学习啦小编为大家整理了Linux系统中数据库命令是什么的相关知识&#xff0c;希望对大家有帮助!Linux系统中的数据库命令是什么&#xff1a;常用命令1.linux下启动mysql的命令&#xff1…

C#.NET 中的类型转换

前些天&#xff0c;碰到了数据类型转换与格式化问题&#xff0c;在网上查找了一下&#xff0c;有人已经把它写了出来&#xff0c;粘贴如下&#xff0c;共大家分享&#xff1a;C#.NET 中的类型转换C# 出来也有些日子了&#xff0c;最近由于编程的需要&#xff0c;对 C# 的类型转…

『科学计算』可视化二元正态分布3D科学可视化实战

二元正态分布可视化本体 由于近来一直再看kaggle的入门书&#xff08;sklearn入门手册的感觉233&#xff09;&#xff0c;感觉对机器学习的理解加深了不少&#xff08;实际上就只是调包能力加强了&#xff09;&#xff0c;联想到假期在python科学计算上也算是进行了一些尝试学…

继中美之后,欧盟会成为下一个 AI 超级体吗?

美国和中国已经是毋庸置疑的AI超级体了&#xff0c;那么欧盟有可能成为下一个吗&#xff1f;德国总理安格拉默克尔以冷酷无情著称&#xff0c;但需要的时候她也可以很幽默。在最近一次由科技杂志《Ada》举办的季度会议上&#xff0c;有人问她是否认为机器人应当拥有权利&#x…

Transformer新型神经网络在机器翻译中的应用 | 公开课笔记

嘉宾 | 于恒来源 | AI科技大本营在线公开课编辑 | Jane于恒&#xff1a;直播间的朋友大家好&#xff01;欢迎大家来到本次AI科技大本营公开课&#xff0c;我是本次讲师于恒。在讲课开始之前先简短的做个自我介绍&#xff0c;我是博士毕业于中国科学院计算技术研究所&#xff0c…

linux终端vi退出命令,如何从命令行关闭vim?

问题描述我知道这更像是一个普通的linux问题&#xff0c;但是没有。因此&#xff0c;当我在命令提示符下输入类似vim的程序时&#xff0c;它会显示文件中的所有文本&#xff0c;我可以编辑它等等。但是我无法弄清楚如何关闭或保存文件并返回命令提示符而不会被杀死这个过程。任…

Mysql 小数点后最多保留两位数

CAST(money/100 as DECIMAL(10,2)) AS num 转载于:https://www.cnblogs.com/moxiaoping/p/7611090.html

这次拿下Python全靠它了!一个交互式的学习资源!

你的假期余额已不足&#xff01;在假期的最后一天&#xff0c;我们给大家介绍一本非常 nice 的 Python 学习书——Project Python。Project Python是一本免费的交互式书籍&#xff0c;它通过使用图形、动画和游戏来教你用 Python编写代码。后面你还将学到解决经典计算机科学问题…

linux启动sql server数据库,SQL Server数据库启动过程详解及启动不起来的问题分析及解决方法...

第五步、启动系统数据库modelmodel系统数据库同样也是SQL Server启动过程中用到的一个非常关键的数据库&#xff0c;如果这个库损坏&#xff0c;SQL Server启动也会失败&#xff0c;关于model数据不能启动的原因基本和master的类似&#xff0c;同样也是两种&#xff1a;1、数据…

navicat对mysql的备份

1&#xff1a;备份位置&#xff1a;_3306的“连接信息”可以看到。或者点&#xff1a;前往设置保存路径 2&#xff1a;建议一定时间点进行备份或者命令执行&#xff1b;转载于:https://blog.51cto.com/q168988/1969780

上当记,收国外快递时,注意相关责任定义

刚才在收到M$从米国寄来的包裹时&#xff0c;一时大意给了送快递的&#xff11;百多的税钱&#xff0c;后来想想不对&#xff0c;在包裹上看到DDP字样&#xff08;Delivery duty paid&#xff09;&#xff0c;上网一查DDP&#xff1a; “完税后交货&#xff08;……指定目的地&…

python远程登录linux命令,Python+requests通过paramiko远程登录Linux执行sh命令

在做自动化测试过程中, 偶尔需要登录Linux服务器执行一些sh命令。Python的paramiko模块, 遵循SSH2协议, 支持以加密和认证的方式远程连接服务器, 可用来连接远程linux主机, 然后执行Linux命令或者通过SFTP传输文件封装的方法import paramikoclass Operate_Server():def __init_…

2017-09-29 前端日报

2017-09-29 前端日报 精选 被誉为神器的requestAnimationFrame我是怎样让网站用上HTML5 ManifestReact 的性能优化&#xff08;一&#xff09;当 PureComponent 遇上 ImmutableJSJavaScript 异步队列实现及拓展CSS Grid Gotchas And Stumbling BlocksAbortable fetchAlloyTeam …

Apache Kylin v2.5.0正式发布,开源分布式分析引擎

文章转载自开源中国&#xff0c;作者 Apache Kylin 社区日前&#xff0c;Apache Kylin 社区宣布&#xff0c;Apache Kylin v2.5.0 正式发布。Apache Kylin 是一个开源的分布式分析引擎&#xff0c;旨在为极大数据集提供 SQL 接口和多维分析&#xff08;OLAP&#xff09;的能力。…

不同职业阶段的修炼: 多与少

有多才有少 开学第一天&#xff0c;教室里挤满来选修“领导”课程的学生&#xff0c;这一群两年后就会变成企业竞相争取的名校MBA&#xff0c;心中难免兴奋地等待教授的出现。教室门被推开后&#xff0c;走进三个人&#xff0c;教授后面跟着一个年轻的陌生人&#xff0c;还有一…

underscorejs之 _.indexBy(list, iteratee, [context])

语法 _.indexBy(list, iteratee, [context]) 说明 给定一个list&#xff0c;和 一个用来返回一个在列表中的每个元素键 的iterator 函数&#xff08;或属性名&#xff09;&#xff0c; 返回一个每一项索引的对象。和groupBy非常像&#xff0c;但是当你知道list的key是唯一的时候…

linux shell $0怎么输出,linux shell中$0,$?,$!等的特殊用法

一、Shell脚本中$0、$?、$!、$$、$*、$#、$等的意义说明(1)$$Shell本身的PID(ProcessID&#xff0c;即脚本运行的当前进程ID号)(2)$!Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)(3)$?最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示…

云从科技完成B+轮超10亿元融资,多个国家基金进入

10 月 8 日&#xff0c;中国人工智能国家队云从科技宣布正式完成新一轮超 10 亿元人民币融资&#xff0c;除元禾原点、越秀金控&#xff0c;刘益谦等原有股东继续跟投外&#xff0c;本轮新增了多家中国国家战略投资者&#xff0c;其中不乏知名地方政府基金&#xff0c;包括中国…

12×××求职经过-之求职信

求职信&#xff1a; 鼠&#xff1a;本地户口&#xff0c;以前在武钢工地打过工&#xff0c;转移过一部分钢材的所有权&#xff0c;被当做失足青年挽救三年。擅长上夜班&#xff0c;会开麻木&#xff0c;求社区服务&#xff0c;家政等职。 牛&#xff1a;身体好&#xff0c;能吃…

面向对象三大特性一一封装(encapsulation)

为什么要封装&#xff1f; 我们看电视&#xff0c;只要按一下开关和换台就行了。有必要了解电视的内部结构吗&#xff1f;有必要了解显像管吗&#xff1f; 封装是为了隐藏对象内部的复杂性&#xff0c;只对外公开简单的接口。便于外界调用&#xff0c;从而提高系统的可扩展性&a…

云计算赋能人工智能,未来的红利在哪?

“云”这个概念对于身处于信息时代的我们而言越来越熟悉&#xff0c;而云计算平台作为对计算机软硬件资源进行集中存储、管理的平台&#xff0c;已经不再是一个遥远的 IT 概念&#xff0c;它开始渗透到各行各业&#xff0c;未来将会像水和电一样&#xff0c;作为基础设施&#…

pxe linux 配置文件,Linux PXE 部署

一、基础环境准备Linux配置静态IP-192.168.5.1# vim /etc/sysconfig/network-scripts/ifcfg-eth0DEVICEeth0ONBOOTyesBOOTPROTOstaticIPADDR192.168.5.1NETMASK255.255.255.0:x --保存退出#service network restart#service iptables stop二、准备安装镜像#mount /dev/cdrom /m…

Keras还是TensorFlow?深度学习框架选型实操分享

译者| 王天宇、林椿眄责编| Jane、琥珀出品| AI科技大本营深度学习发展势头迅猛&#xff0c;但近两年涌现的诸多深度学习框架让初学者无所适从。如 Google 的 TensorFlow、亚马逊的 MXNet、Facebook 支持的 PyTorch、Theano、Caffe、CNTK、Chainer、百度的 PaddlePaddle、DSSTN…

Android -- queryIntentActivities

某些时候你想要知道某个APP是否有注册了一个明确的intent&#xff0c;比如说你想要检查某个receiver是否存在&#xff0c;然后根据是否存在来这个receiver来在你的AP里面enable某些功能。我们可以通过PackageManager来check它。 code public boolean isIntentAvailable(Context…

吉大c语言程序设计作业一,吉林大学历年C语言程序设计试题及答案.doc

吉林大学历年C语言程序设计试题及答案吉林大学历年C语言程序设计试题及答案(5)END2000年试题答案一、(1)解题思想&#xff1a; 用5个数 a,b,c,d,e,来回替换&#xff0c;最终f(n)算出。设计程序如下&#xff1a;int F(int n){ if(n <5) return n ;int temp,a1;b2;c3;d4;e5;fo…

忍不住心中的激动

天天上自行车旅行网&#xff0c;看到别人的出行游记&#xff0c;心里很羡慕&#xff0c;也很冲动&#xff0c;想想还有1个多月就可以出发了&#xff0c;不知道能坚持到哪里&#xff0c;恒心是有的&#xff0c;可身体就不知道&#xff0c;不过这次时间可以不用那么紧&#xff0c…

程序员入错行怎么办?

程序员应该选择什么技术领域才能获得最高的回报&#xff1f;本文详细解读了 2018 年最热门的五大领域&#xff0c;对行业现状、薪资概况及具体的技能要求给出了深入的分析&#xff0c;希望给担心“入错行”的你提供些指导。七天国庆黄金周转眼就过&#xff0c;退散的除了出游热…