深入分析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 相关文章推荐
如何实现浏览器上的右键菜单
Jul 10 Javascript
JavaScript 变量命名规则
Sep 23 Javascript
jQuery 表单验证扩展代码(二)
Oct 20 Javascript
IE下写xml文件的两种方式(fso/saveAs)
Aug 05 Javascript
JS 两个字符串时间的天数差计算
Aug 25 Javascript
javascript页面加载完执行事件代码
Feb 11 Javascript
javascript与jquery中的this关键字用法实例分析
Dec 24 Javascript
基于javascript实现图片滑动效果
May 07 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 Javascript
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
html5中sharedWorker实现多页面通信的示例代码
May 07 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版本号
2006/10/09 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
PHP基本语法实例总结
2016/09/09 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
Python实现数值积分方式
2019/11/20 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
python实现双色球随机选号
2020/01/01 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
小学教师事迹材料
2014/01/13 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
培训协议书范本
2014/04/22 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
oracle重置序列从0开始递增1
2022/02/28 Oracle