深入分析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 相关文章推荐
Extjs Ajax 乱码问题解决方案
Apr 15 Javascript
jQuery EasyUI API 中文文档 - Panel面板
Sep 30 Javascript
SinaEditor使用方法详解
Dec 28 Javascript
js保留小数点后几位的写法
Jan 03 Javascript
jQuery中click事件用法实例
Dec 26 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
Sep 01 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
jquery分隔Url的param方法(推荐)
May 25 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
Jun 26 jQuery
利用Javascript获取选择文本所在的句子详解
Dec 03 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
Jan 09 Javascript
vue-cli 构建骨架屏的方法示例
Nov 08 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格式化日期实例分析
2014/11/12 PHP
ThinkPHP里用U方法调用js文件实例
2015/06/18 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
python读写csv文件方法详细总结
2019/07/05 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Python while true实现爬虫定时任务
2020/06/08 Python
Python面向对象实现方法总结
2020/08/12 Python
html5唤醒APP小记
2019/03/27 HTML / CSS
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
为什么使用接口?
2014/08/13 面试题
上班玩手机检讨书
2014/02/17 职场文书
总账会计岗位职责
2014/03/13 职场文书
不错的求职信范文
2014/07/20 职场文书
2015年入党决心书
2015/02/05 职场文书
会计求职自荐信
2015/03/26 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript