当前位置: 首页 > news >正文

【JSON与JSONP】JSON与JSONP全面解析:定义、区别与核心技术对比

一、JSON与JSONP的基本定义

  1. JSON(JavaScript Object Notation)

    • 本质:一种轻量级的文本数据交换格式,基于键值对结构描述数据(如{"name":"John"}),支持字符串、数字、布尔值、数组、对象和null等数据类型。
    • 语法规则
      • 键名必须用双引号包裹,值可以是任意合法数据类型。
      • 对象用花括号{}表示,数组用方括号[]表示,数据项间用逗号分隔。
  2. JSONP(JSON with Padding)

    • 本质:一种利用<script>标签实现跨域请求的非官方协议,通过动态脚本执行获取数据。
    • 核心原理:服务器返回以函数调用包裹的JSON数据(如callback({"data":123})),客户端通过预定义的回调函数处理数据。

二、JSON与JSONP的核心区别

对比维度JSONJSONP
数据格式纯数据格式,遵循严格的语法规则以函数调用包裹的JSON数据(如callback({...})
用途与目的通用数据交换,适用于前后端通信专为解决跨域请求而设计
跨域支持受同源策略限制,需配合CORS实现跨域天然支持跨域,无需CORS配置
安全性安全性高,支持内容安全策略(CSP)存在XSS风险,依赖服务端信任

三、JSONP的工作原理与实现细节

  1. 动态创建<script>标签

    • 客户端通过JavaScript动态创建<script>标签,并将请求URL指向目标服务端(如src="http://api.com/data?callback=handleData")。
  2. 回调函数处理数据

    • 服务端返回数据格式为回调函数名(JSON数据)(如handleData({"status":200})),客户端需提前定义同名函数以接收数据。
  3. 自定义回调函数名

    • 通过URL参数指定回调函数名(如?callback=myFunc),服务端根据该参数动态生成返回内容。

四、其他相关技术对比

1. Ajax与JSONP的区别
维度AjaxJSONP
通信方式基于XMLHttpRequest对象基于<script>标签动态加载
跨域支持需服务端设置CORS响应头天然支持跨域
数据格式支持多种格式(JSON、XML等)仅支持JSONP格式
2. JSON与JSONB的区别
  • JSON:存储为纯文本,保留格式(如空格、键顺序),查询效率较低。
  • JSONB(如PostgreSQL中的二进制JSON):以二进制格式存储,支持索引和高效查询,但写入时需转换格式[注:搜索结果未直接提及,需结合数据库知识补充]。
3. NATP与JSON报文的区别
  • NATP:可能指网络地址转换协议(Network Address Translation Protocol),用于IP地址映射,与数据传输无关。
  • JSON报文:指基于JSON格式封装的应用层数据,用于业务逻辑交互[注:搜索结果未提及NATP,需结合网络协议知识推断]。

五、总结

JSON作为通用的数据交换格式,在前后端交互中占据核心地位;而JSONP作为一种“曲线救国”的跨域方案,虽逐渐被CORS替代,但在旧系统兼容场景中仍有价值。开发者需根据安全性、跨域需求和技术栈选择合适的方案。

http://www.dtcms.com/a/48726.html

相关文章:

  • 《OpenCV》——卷积神经网络人脸检测
  • 网络编程相关概念
  • (十二)基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例
  • spark写数据库用连接池找不到driver类
  • 安装 cnpm 出现 Unsupported URL Type “npm:“: npm:string-width@^4.2.0
  • iterm2更新后主题报错
  • SpringBoot篇(自动装配原理)
  • 大模型学习笔记------LLM模型开发流程
  • Python----数据分析(Matplotlib二:绘图一:折线图,条形图,直方图)
  • Python 爬取唐诗宋词三百首
  • C# Unity 唐老狮 No.4 模拟面试题
  • JDBC核心技术解析:从基础连接到ORM演进之路(上)
  • JavaWeb2025.02.28
  • 2.编程语音和工具介绍
  • unity学习62,尝试做第一个小游戏项目:flappy bird
  • 【http://noi.openjudge.cn/】4.3算法之图论——1538:Gopher II
  • 【开源-开源C++框架boost和poco的对比】
  • USRP4120-通用软件无线电平台
  • MATLAB CVX 能处理的目标函数数量级极限是多少?
  • VSCode 移除EmmyLua插件的红色波浪线提示
  • 《一个端粒到端粒的参考基因组为木瓜中五环三萜类化合物生物合成提供了遗传学见解》
  • kafka-关于ISR-概述
  • 探秘基带算法:从原理到5G时代的通信变革【三】Turbo 编解码
  • GEO数据挖掘
  • 本地部署Qwen2.5-VL-7B-Instruct模型
  • 【cuda学习日记】5.3 减少全局内存访问
  • 蓝桥杯牛客1-10重点(自用)
  • Tauri+React跨平台开发全场景问题解析
  • leetcode_字典树 140. 单词拆分 II
  • 普中51单片机和金沙滩51单片机的对比分析