当后端要你提交一个JSON配置信息时

JSON ( JavaScript Object Notation )

  • JSON是一种格式,基于文本,优于轻量,用于交换数据;
  • 相比XML这个前辈,JSON更加轻量,XML需要用到很多标签,感受一下就好了
  • 像上面的例子中,你可以明显看到XML格式的数据中标签本身占据了很多空间,JSON比较轻量,即相同数据,以JSON的格式占据的带宽更小,这在有大量数据请求和传递的情况下是有明显优势的。
  • 但更重要的JSON是易于阅读、编写和机器解析的,即这个JSON对人和机器都是友好的,而且又轻,独立于语言(因为是基于文本的),所以JSON被广泛用于数据交换。
  • 前端Er对这个套路肯定很熟悉,发送AJAX从API中获取JSON格式的数据,然后执行页面的逻辑,下面以前端JS进行AJAX的POST请求为例,后端PHP处理请求为例:
  1. 前端构造一个JS对象,用于包装要传递的数据,然后将JS对象转化为JSON字符串,再发送请求到后端;
2. 后端PHP接收到这个JSON字符串,将JSON字符串转化为**PHP对象**,然后处理请求。
3. 可以看到,相同的数据在这里有3种不同的表现形式,分别是前端的**JS对象**、传输的**JSON字符串**、后端的**PHP对象**,JS对象和PHP对象明显不是一个东西,但是由于大家用的都是**JSON**来传递数据,大家都能理解这种数据格式,都能把**JSON这种数据格式很容易地转化为自己能理解的数据结构**;

JSON 是 JavaScript 的子集?

  • 我一直以为JSON就是JS的子集,是为什么形成了这种理解呢?
// JS对象
let foo = {}; 
// JS对象,只不过你可以把这个称之为JSON格式的 JavaScript对象
let bar = {
  "name": "bar",
  "price": 1000,
  "buyer": [1, 2, 3]
};
//  这个就是JSON格式的字符串
let str1 = JSON.stringify(bar);
let str2 = '{"name": "bar", "price": 1000, "buyer": [1, 2, 3]}';
  • 你看不仅能相互转换,嵌套格式和语法都一样,再看看下面一个POST请求,场景是一个复杂的配置信息
const postData = {
    "attribution": 1,
    "category": 2,
     "groupid": 3,
    "parentid": 4,
    "shopid": 5,
    "groupname": "foo",
    "config": {
      "tagfilter": [{"id": 123, "name": "group-XX"}],
      "product": [{"id": "123123123123123", "name": "prod-YY"}]
    } 
};
$.ajax({
    url: '/api/xxx/yyy', //api接口地址 
    data: postData, //复杂的配置信息
    contentType: "application/json;charset=utf-8", // 客户端请求格式
    type: 'POST', // 数据传输方式
    dataType: 'json', // 服务端返回数据格式
}).done((res) => {
    if (res.success && res.data) {
      console.log(res.data);
    } else {
      layer.msg(res.msg);
    }
}).fail(() => {
    layer.msg('网络开小差~请稍后再试!');
}).always( ()=> {
    utils.loadingOff();
});
  • 你看,既然你需要一个JSON,我就给你好了,就如同你给我的JSON一样,我直接把JS的一个对象给POST过去,还异想天开的给加了一个contentType,嗯~后端拿到就是一个JSON,然后Chrome直接默认给我转换成了表单提交过去了···;

JSON & JavaScript Object?

1. 两个本质不同的东西为什么那么密切?

  • JSON 是一种语法用来序列化对象、数组、数值、字符串、布尔值和 null
    。它基于 JavaScript 语法,但与之不同:一些JavaScript不是JSON,一些JSON不是JavaScript

  • JSON和JS对象本质上完全不是同一个东西,就像“斑马线”和“斑马”,“斑马线”基于“斑马”身上的条纹来呈现和命名,但是斑马是活的,斑马线是非生物。

  • 同样,"JSON"全名"JavaScript Object Notation",所以它的格式(语法)是基于JS的,但它就是一种格式,而JS对象是一个实例,是存在于内存的一个东西。

  • 说句玩笑话,如果JSON是基于PHP的,可能就叫PON了,形式可能就是这样的了['propertyOne' => 'foo', 'propertyTwo' => 42,],如果这样,那么JSON可能现在是和PHP比较密切了。

  • 此外,JSON是可以传输的,因为它是文本格式,但是JS对象是没办法传输的,在语法上,JSON也会更加严格,但是JS对象就很松了。那么两个不同的东西为什么那么密切,因为JSON毕竟是从JS中演变出来的,语法相近。

  • 至于更详细的区别可以看MDN

2. 如何通过AJAX传输复杂的JSON格式呢?

  • 这锅不归jQuery;

调用$.ajax函数时,即使设置contentTypeapplication/json; charset=utf-8,如果不设置,默认给你一个application/x-www-form-urlencoded 爽歪歪;如果给data属性传递的是一个的JS对象,这时候jQuery也不会将其自动转换为JSON string, jQuery 默认会将给data赋予的对象(除字符串之外的任何东西)处理为适用于”application/x-www-form-urlencoded”的请求字符串。有一个选项processData来控制默认的自动转换,设置其为false,jQuery就不会自动转换对象。

  • JSON.stringify();

JS 新建一个对象,将复杂的配置信息赋值给这个对象,最后JSON.stringify()一下,将这个JavaScript值转换为一个JSON字符串,那么后端也方便解析,如果你就这么把这个JS对象POST过去,Chrome下就会给你解析成表单提交,如果数据够复杂,让后端解析你的东西都心烦~~~那么你从接口拿到的数据,就会变成字符串了,你就需要用到下面这个方法;

  • JSON.parse();

一般用到这个,当然不可能是后端会这么给你复杂数据结构,然后你要parse一下其实,我也见过,一般是要往浏览器里面存储临时信息,再次打开浏览器时就算用户没有通过接口保存,也可以方便记忆上次用户的配置~一般和localStoragesessionStorage搭配~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,882评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,208评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,746评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,666评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,477评论 6 407
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,960评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,047评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,200评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,726评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,617评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,807评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,327评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,049评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,425评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,674评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,432评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,769评论 2 372

推荐阅读更多精彩内容