深入分析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 相关文章推荐
jquery URL参数判断,确定菜单样式
May 31 Javascript
JavaScript中的依赖注入详解
Mar 18 Javascript
JQuery控制radio选中和不选中方法总结
Apr 15 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
Aug 21 Javascript
js实现左侧网页tab滑动门效果代码
Sep 06 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
May 25 Javascript
Node.js Streams文件读写操作详解
Jul 04 Javascript
bootstrap导航、选项卡实现代码
Dec 28 Javascript
使用vue构建移动应用实战代码
Aug 02 Javascript
Node错误处理笔记之挖坑系列教程
Jun 05 Javascript
一起写一个即插即用的Vue Loading插件实现
Oct 31 Javascript
原生js实现下拉选项卡
Nov 27 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中create table语句的基本语法是
2007/01/15 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
js实现文字滚动效果
2016/03/03 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
js实现简易计算器功能
2019/10/18 Javascript
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python删除列表内容
2015/08/04 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
浅谈css3中的前缀
2016/07/20 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
应届大学生简历中的自我评价
2014/01/15 职场文书
服装采购员岗位职责
2014/03/15 职场文书
股指期货心得体会
2014/09/13 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
详解Laravel服务容器的优势
2021/05/29 PHP
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js