深入分析JSON编码格式提交表单数据


Posted in Javascript onJune 25, 2015

 以JSON编码格式提交表单数据是HTML5对WEB发展进化的又一大贡献,以前我们的HTML表单数据是通过key-value方式传输的服务器端,这种形式的传输对数据组织缺乏管理,形式十分原始。而新出现的JSON格式提交表单数据方法,将表单里的所有数据转化的具有一定规范的JSON格式,然后传输的服务器端。服务器端接收到的数据是直接可以使用的合格JSON代码。

 如何声明以JSON格式提交表单

大家应该对如何用表单上传一个文件的写法很熟悉,它需要在HTML中form标记上添加 enctype="multipart/form-data" 声明,就是告诉浏览器要按上传文件模式发送表单数据。而JSON格式提交表单的声明与此类似,它的写法是: enctype='application/json'。

 对老式浏览器的兼容

以JSON格式提交表单是HTML5中一种很新的规范,只有实现了这些规范的现代浏览器才能识别 enctype='application/json'的语义,才能正确的将表单数据打包成JSON格式。而对于一些老式浏览器,以及还未实现这些标准的浏览器,它们无法识别 enctype='application/json'代表什么,于是表单的enctype会自动退化成application/x-www-form-urlencoded缺省编码格式。服务器端代码可以根据enctype的值来判断如何接收数据。

 JSON编码格式提交表单的格式范例

例1 基本用法

<form enctype='application/json'>
 <input name='name' value='Bender'>
 <select name='hind'>
  <option selected>Bitable</option>
  <option>Kickable</option>
 </select>
 <input type='checkbox' name='shiny' checked>
</form>

// 生成的Json数据是
{
 "name":  "Bender"
, "hind":  "Bitable"
, "shiny": true
}

例2 当表单存在多个重名的表单域时,按JSON数组编码

<form enctype='application/json'>
 <input type='number' name='bottle-on-wall' value='1'>
 <input type='number' name='bottle-on-wall' value='2'>
 <input type='number' name='bottle-on-wall' value='3'>
</form>

// 生成的Json数据是
{
 "bottle-on-wall":  [1, 2, 3]
}

例3 表单域名称以数组形成出现的复杂结构

<form enctype='application/json'>
 <input name='pet[species]' value='Dahut'>
 <input name='pet[name]' value='Hypatia'>
 <input name='kids[1]' value='Thelma'>
 <input name='kids[0]' value='Ashley'>
</form>

// 生成的Json数据是
{
  "pet": {
    "species": "Dahut"
  ,  "name":   "Hypatia"
  }
,  "kids":  ["Ashley", "Thelma"]
}

例4 在上面的例子中,缺失的数组序号值将以null替代

<form enctype='application/json'>
 <input name='hearbeat[0]' value='thunk'>
 <input name='hearbeat[2]' value='thunk'>
</form>

// 生成的Json数据是
{
  "hearbeat":  ["thunk", null, "thunk"]
}

例5 多重数组嵌套格式,嵌套层数无限制

<form enctype='application/json'>
 <input name='pet[0][species]' value='Dahut'>
 <input name='pet[0][name]' value='Hypatia'>
 <input name='pet[1][species]' value='Felis Stultus'>
 <input name='pet[1][name]' value='Billie'>
</form>

// 生成的Json数据是
{
 "pet": [
  {
   "species": "Dahut"
  , "name":  "Hypatia"
  }
 , {
   "species": "Felis Stultus"
  , "name":  "Billie"
  }
 ]
}

例6 真的,没有数组维度限制!

<form enctype='application/json'>
 <input name='wow[such][deep][3][much][power][!]' value='Amaze'>
</form>

// 生成的Json数据是
{
 "wow": {
  "such": {
   "deep": [
    null
   , null
   , null
   , {
     "much": {
      "power": {
       "!": "Amaze"
      }
     }
    }
   ]
  }
 }
}

例7 文件上传

<form enctype='application/json'>
 <input type='file' name='file' multiple>
</form>

// 假设你上传了2个文件, 生成的Json数据是:
{
 "file": [
  {
   "type": "text/plain",
   "name": "dahut.txt",
   "body": "REFBQUFBQUFIVVVVVVVVVVVVVCEhIQo="
  },
  {
   "type": "text/plain",
   "name": "litany.txt",
   "body": "SSBtdXN0IG5vdCBmZWFyLlxuRmVhciBpcyB0aGUgbWluZC1raWxsZXIuCg=="
  }
 ]
}
Javascript 相关文章推荐
javaScript checkbox 全选/反选及批量删除
Apr 28 Javascript
js浮点数精确计算(加、减、乘、除)
Dec 26 Javascript
JQuery.get提交页面不跳转的解决方法
Jan 13 Javascript
js+css实现文字散开重组动画特效代码分享
Aug 21 Javascript
有关Promises异步问题详解
Nov 13 Javascript
图文详解JavaScript的原型对象及原型链
Aug 02 Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
May 03 Javascript
如何将百度地图包装成Vue的组件的方法步骤
Feb 12 Javascript
bootstrap table插件动态加载表头
Jul 19 Javascript
微信小程序手动添加收货地址省市区联动
May 18 Javascript
jquery移动点击的项目到列表最顶端的方法
Jun 24 #Javascript
jquery使整个div区域可以点击的方法
Jun 24 #Javascript
jQuery寻找n以内完全数的方法
Jun 24 #Javascript
js实现仿阿里巴巴城市选择框效果实例
Jun 24 #Javascript
Javascript常用小技巧汇总
Jun 24 #Javascript
js实现的倒计时按钮实例
Jun 24 #Javascript
js实现大转盘抽奖游戏实例
Jun 24 #Javascript
You might like
PHP 文件上传源码分析(RFC1867)
2009/10/30 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
php页面缓存方法小结
2015/01/10 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
yy司仪主持词
2014/03/22 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
大学生暑期实践报告
2015/07/13 职场文书
学习经验交流会策划书
2015/11/02 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript
python实现商品进销存管理系统
2022/05/30 Python