深入分析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 相关文章推荐
js播放wav文件(源码)
Apr 22 Javascript
jquery ajax中使用jsonp的限制解决方法
Nov 22 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
分享自己用JS做的扫雷小游戏
Feb 17 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
Nov 28 Javascript
JS新包管理工具yarn和npm的对比与使用入门
Dec 09 Javascript
Bootstrap栅格系统的使用和理解2
Dec 14 Javascript
node.js+jQuery实现用户登录注册AJAX交互
Apr 28 jQuery
深入理解Node.js中通用基础设计模式
Sep 19 Javascript
JavaScript根据json生成html表格的示例代码
Oct 24 Javascript
JQuery常见节点操作实例分析
May 15 jQuery
swiper实现异形轮播效果
Nov 28 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
基于mysql的bbs设计(二)
2006/10/09 PHP
php 分页原理详解
2009/08/21 PHP
PHP 验证码的实现代码
2011/07/17 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
window.open被浏览器拦截后的自定义提示效果代码
2007/11/19 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
Opencv实现抠图背景图替换功能
2019/05/21 Python
Python控制Firefox方法总结
2019/06/03 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
解决django FileFIELD的编码问题
2020/03/30 Python
利用python进行文件操作
2020/12/04 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
判断单链表中是否存在环
2012/07/16 面试题
计算机专业学生的自我评价
2013/12/15 职场文书
单位提档介绍信
2014/01/17 职场文书
我的求职择业计划书
2014/04/04 职场文书
大学活动总结模板
2014/07/10 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
Redis实现一个账号只能登录一个设备
2022/04/19 Redis
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers