深入分析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获取鼠标坐标的实例方法
Jul 18 Javascript
Json实现异步请求提交评论无需跳转其他页面
Oct 11 Javascript
jQuery实现切换字体大小的方法
Mar 10 Javascript
jquery实现具有嵌套功能的选项卡
Feb 12 Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 Javascript
Flask中获取小程序Request数据的两种方法
May 12 Javascript
Vue非父子组件通信详解
Jun 12 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
Mar 05 Javascript
详解vue组件开发脚手架
Jun 15 Javascript
微信小程序实现签到功能
Oct 31 Javascript
微信小程序实现图片选择并预览功能
Jul 25 Javascript
js实现随机点名器精简版
Jun 29 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
PHP面向对象编程快速入门
2006/12/14 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
JavaScipt基本教程之前言
2008/01/16 Javascript
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
Python导入oracle数据的方法
2015/07/10 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
YUV转为jpg图像的实现
2019/12/09 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
2015年医院后勤工作总结
2015/05/20 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python