深入分析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 事件参考手册
Dec 24 Javascript
js删除所有的cookie的代码
Nov 25 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
angular源码学习第一篇 setupModuleLoader方法
Oct 20 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
Feb 14 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
Vue中img的src属性绑定与static文件夹实例
May 18 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
vue 实现边输入边搜索功能的实例讲解
Sep 16 Javascript
vue项目动态设置页面title及是否缓存页面的问题
Nov 08 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
Jun 10 Javascript
JavaScript实现酷炫的鼠标拖尾特效
Feb 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时间和日期函数详解
2015/05/08 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
JS 统计时间
2021/03/09 Javascript
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
Js event事件在IE、FF兼容性问题
2011/01/01 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
django 2.2和mysql使用的常见问题
2019/07/18 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
Python Selenium截图功能实现代码
2020/04/26 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
售后服务承诺书
2014/03/26 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
上课说话检讨书
2015/01/27 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电