JSON 对象

JSON (JavaScript Object Notation 的缩写)

也是一种数据,是 JavaScript 的原生对象,用来处理 JSON 格式数据。它有两个静态方法:JSON.stringify() 和  JSON.parse()

是一种无序的属性名和属性值的集合,用于网站的前后台交互。

  • 在前后台交互的时候,虽然数据的格式是 json,但要用字符串的形式进行传递
  • 发送时,使用 JSON.stringify( json对象 ) 将 json 对象转换成字符串。
  • 接收时,用 JSON.parse(字符串形式的 json ) 解析成 json 对象。
    1. var p = {
    2. name: '周杰伦',
    3. age: 40
    4. };
    5.  
    6. var jsonObj = {
    7. "name":"陶喆",
    8. "age":"45",
    9. "gender":"true",
    10. };

    11. // 发送
      var jsonStr = JSON.stringify(jsonObj); //
    12.  
    13. // 接收
      var jsonObj = JSON.parse(jsonStr); //
    14.  
    15. // for...in...遍历 json对象
      for var k in jsonObj{
      console
      }
  • JSON 格式是用于数据交换的文本格式
    • 2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。
    • JSON 迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准。
    • 目的是取代繁琐笨重的 XML 格式。
    • 两个显著的优点:
      • 书写简单,一目了然;
      • 符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。
  • 每个 JSON 对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或更多的值。
  • JSON 对值的类型和格式有严格的规定

    • 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象
    • 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)
    • 字符串必须使用双引号表示,不能使用单引号
    • 对象的键名必须放在双引号里面
    • 数组或对象最后一个成员的后面,不能加逗号
  • JSON.stringify()
    • 第一个参数为JSON对象,将转为 ' JSON 字符串' 。该字符串符合 JSON 格式,并且可以被 JSON.parse 方法还原
    • 第一个参数如果是原始类型的字符串,结果会带双引号,转换为 "JSON字符串"。
      • 这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值

        1. JSON.stringify('foo') === "foo" // false
        2. JSON.stringify('foo') === "\"foo\"" // true
        3. //字符串foo,被转成了"\"foo"\"。
        4. // 这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值
        5.  
        6. JSON.stringify(false); // "false"
        7. // 由于没有内层双引号,所以原始值是布尔,而不是字符串
        8.  
        9. JSON.stringify('false'); // "\"false\""
    • 如果对象属性值是 undefined、函数或 XML 对象,该属性会 JSON.stringify 过滤
    • 如果数组成员undefined、函数或 XML 对象,则这些值被转成 null
    • 正则对象会被转成空对象    JSON.stringify(/foo/)        // "{}"
    • 会忽略对象的不可遍历的属性

        1. var obj = {};
        2. Object.defineProperties(obj, {
        3. 'foo': {
        4. value: 1,
        5. enumerable: true
        6. },
        7. 'bar': {
        8. value: 2,
        9. enumerable: false
        10. }
        11. });
        12.  
        13. JSON.stringify(obj); // "{"foo":1}"
    • 还可以接受接受一个数组,作为第二个参数,指定需要转成字符串的属性。。。只对对象的属性有效,对数组无效
      • 指定要解析的属性

          1. var obj = {
          2. 'prop1': 'value1',
          3. 'prop2': 'value2',
          4. 'prop3': 'value3'
          5. };
          6.  
          7. var selectedProperties = ['prop1', 'prop2'];
          8.  
          9. JSON.stringify(obj, selectedProperties); //{"prop1":"value1","prop2":"value2"}"
    • 第二个参数还可以是一个函数,用来更改 JSON.stringify 的返回值
    • 函数,接受两个参数,分别是被转换的对象的键名和键值
    • 递归处理所有的键。每次递归处理前一次修改后的对象
    • 如果处理函数返回undefined或没有返回值,则该属性会被忽略o
        1. function f(key, value) {
        2. if (typeof value === "number") {
        3. value = 2 * value;
        4. }
        5. return value;
        6. }
        7.  
        8. JSON.stringify({ a: 1, b: 2 }, f); // '{"a": 2,"b": 4}'
    • 还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。
      • 如果是数字,表示每个属性前面添加的空格(最多不超过10个)
      • 如果是字符串(不超过10个字符),则该字符串会添加在每行前面
          1. JSON.stringify({ p1: 1, p2: 2 }, null, 2);
          2. /*
          3. "{
          4. "p1": 1,
          5. "p2": 2
          6. }"
          7. */
          8.  
          9. JSON.stringify({ p1:1, p2:2 }, null, '|-');
          10. /*
          11. "{
          12. |-"p1": 1,
          13. |-"p2": 2
          14. }"
          15. */
    • 第一个参数,即JSON对象,如果含有 toJSON() 方法,则直接使用这个方法的返回值作为参数,而忽略原对象的其他参数
    • Date 就拥有自己的 toJSON() 方法
    • toJSON方法的一个应用是,将正则对象自动转为字符串。JSON.stringify默认不能转换正则对象,但是设置了toJSON方法以后,就可以转换正则对象了
      1. var obj = {
      2. reg: /foo/
      3. };
      4.  
      5. // 不设置 toJSON 方法时
      6. JSON.stringify(obj) // "{"reg":{}}"
      7.  
      8. // 设置 toJSON 方法时
      9. RegExp.prototype.toJSON = RegExp.prototype.toString;
      10. JSON.stringify(/foo/) // ""/foo/""
  • JSON.parse()
    • 用于将 JSON 字符串转换成对应的值
    • 如果传入的字符串不是有效的 JSON 格式,JSON.parse方法将报错
    • 为了处理解析错误,可以将JSON.parse方法放在try...catch代码块中
        1. try {
        2. JSON.parse("'String'");
        3. } catch(e) {
        4. console.log('parsing error');
        5. }
    • 可以接受一个处理函数,作为第二个参数,用法与JSON.stringify方法类似
        1. function f(key, value) {
        2. if (key === 'a') {
        3. return value + 10;
        4. }
        5. return value;
        6. }
        7.  
        8. JSON.parse('{"a": 1, "b": 2}', f); // {a: 11, b: 2}

(77)Wangdao.com第十五天_JavaScript 用于数据交换的文本格式 JSON 对象的更多相关文章

  1. (78)Wangdao.com第十五天_JavaScript 面向对象

    面向对象编程(Object Oriented Programming,缩写为 OOP) 是目前主流的编程范式. 是单个实物的抽象, 是一个容器,封装了属性(property)和方法(method),属 ...

  2. (79)Wangdao.com第十五天_JavaScript 对象的继承_prototype原型对象_封装_函数式编程

    javascript 内置了许多 function 函数(){...} js 执行首先就会执行自己内置的函数定义 (function Function.function Object) 对象的继承 大 ...

  3. (76)Wangdao.com第十四天_JavaScript 正则表达式对象 RegExp

    RegExp Regular Expression,正则表达式是一种表达    文本模式(字符串结构)  的式子. 常常用来按照“给定模式”匹配文本.比如,正则表达式给出一个 Email 地址的模式, ...

  4. (92)Wangdao.com_第二十五天_线程机制_H5 Web Workers 分线程任务_事件 Event

    浏览器内核 支撑浏览器运行的最核心的程序 IE 浏览器内核            Trident内核,也是俗称的IE内核Chrome 浏览器内核            统称为 Chromium 内核或 ...

  5. NLP(十五)让模型来告诉你文本中的时间

    背景介绍   在文章NLP入门(十一)从文本中提取时间 中,笔者演示了如何利用分词.词性标注的方法从文本中获取时间.当时的想法比较简单快捷,只是利用了词性标注这个功能而已,因此,在某些地方,时间的识别 ...

  6. SpringMVC(十五) RequestMapping map模型数据

    控制器中使用map模型数据,传送数据给视图. 控制器参考代码: package com.tiekui.springmvc.handlers; import java.util.Arrays; impo ...

  7. R in action读书笔记(20)第十五章 处理缺失数据的高级方法

    处理缺失数据的高级方法 15.1 处理缺失值的步骤 一个完整的处理方法通常包含以下几个步骤: (1) 识别缺失数据: (2) 检查导致数据缺失的原因: (3) 删除包含缺失值的实例或用合理的数值代替( ...

  8. 测开之路一百五十五:jquery-validation前台数据验证

    前面做的wtform验证是服务器端的验证,需要把数据传输到服务器,服务器验证后再吧结果传输到前端,网络慢的时候,用户体验不好,所以需要前端验证,且后端验证不能少 传统的js或者jquery如果要验证信 ...

  9. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

随机推荐

  1. C++回顾day03---<类型转换>

    一:C++类型转换 (一)static_cast<>() 静态类型转换:基本类型可以转换但是指针类型不允许.可以进行隐式类型转换 double n=1.23 int m=static_ca ...

  2. [物理学与PDEs]第2章第4节 激波 4.1 间断连接条件

    1.  守恒律方程 $$\bex \cfrac{\p f}{\p t}+\cfrac{\p q}{\p x}=0 \eex$$ 在间断线上应满足 ``间断连接条件'': $$\bex [f]\cfra ...

  3. 【Unity]】AR小工具-Vuforia

    很有意思的增强现实玩具,六分钟应用. https://www.youtube.com/watch?v=khavGQ7Dy3c

  4. django发送邮件send_mail&send_mass_mail

    一.配置 在setting.py中进行相关配置: EMAIL_HOST = 'smtp.sina.cn' #SMTP地址 EMAIL_PORT = 25 #SMTP端口 EMAIL_HOST_USER ...

  5. LOJ #2116 Luogu P3241「HNOI2015」开店

    好久没写数据结构了 来补一发 果然写的时候思路极其混乱.... LOJ #2116 Luogu P3241 题意 $ Q$次询问,求树上点的颜色在$ [L,R]$中的所有点到询问点的距离 强制在线 询 ...

  6. Junit的基础学习

    一个强大的单元测试框架: 一.组成部分: 1.注解: (1)@Test 注解: 放在测试方法上,表示这是用于测试其他方法的一个测试单元 @Test public void testSum1(){ Sy ...

  7. ES--08

    71.内核原理探秘_最后优化写入流程实现海量磁盘文件合并(segment merge,optimize) 课程大纲 每秒一个segment file,文件过多,而且每次search都要搜索所有的seg ...

  8. 51nod--1072 威佐夫游戏 (博弈论)

    题目: 1072 威佐夫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同 ...

  9. 【原创】大数据基础之Mesos(1)简介、安装、使用

    Mesos 1.7.1 官方:http://mesos.apache.org/ 一 简介 Program against your datacenter like it’s a single pool ...

  10. 【原创】大叔经验分享(17)编程实践对比Java vs Scala

    scala 官方地址 https://www.scala-lang.org/ 本文尽可能包含了一些主要的java和scala在编程实践时的显著差异,展现scala的代码的简洁优雅:scala通吃< ...