深入分析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 相关文章推荐
innerHTML,outerHTML,innerTEXT三者之间的区别
Jan 28 Javascript
JQUERY THICKBOX弹出层插件
Aug 30 Javascript
javascript hasFocus使用实例
Jun 29 Javascript
在网页中使用document.write时遭遇的奇怪问题
Aug 24 Javascript
javascript数组操作总结和属性、方法介绍
Apr 05 Javascript
如何使用jquery修改css中带有!important的样式属性
Apr 28 Javascript
vue中appear的用法
Aug 17 Javascript
VueJs使用Amaze ui调整列表和内容页面
Nov 30 Javascript
在vue里使用codemirror遇到的问题
Nov 01 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
Oct 11 Javascript
快速解决element的autofocus失效问题
Sep 08 Javascript
js获取url页面id,也就是最后的数字文件名
Sep 25 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
document.compatMode介绍
2009/05/21 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
js实现带搜索功能的下拉框
2020/01/11 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
程序员经常用到的UNIX命令
2015/04/13 面试题
总经理司机职责
2014/02/02 职场文书
上课迟到检讨书
2014/02/19 职场文书
抽奖活动主持词
2014/03/31 职场文书
灰雀教学反思
2014/04/28 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
购房意向书
2014/08/30 职场文书
采购员岗位职责范本
2015/04/07 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
干部外出学习心得体会
2016/01/18 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
Python基于百度AI实现抓取表情包
2021/06/27 Python