• JSON学习笔记


    JSON学习笔记

    目录

    简述

      JSON(JavaScript Object Notation)是一种可以被很多语言使用的数据格式,本质上是一个字符串,但是它有自己的语法,这样它就可以被 解析器 转换为编程语言中的元素——简单值、对象、数组。 反过来,编程语言中的元素也可以被 序列化器 转换为 JSON 字符串。

      很多编程语言都有针对 JSON 的解析器和序列化器,比如后台 PHP 把一个 PHP 对象 序列化 为一段 JSON 字符串,传递给前台页面的 JavaScript 脚本,然后 JavaScript 将其 解析 为一个 JavaScript 对象。

      下文将解答两个问题:

    1. 语法:JSON可以表示哪些数据?

    2. 解析与序列化:JSON字符串与 JavaScript 数据如何互相转换?

     

    一、语法

    JSON作为数据桥梁,可以表示简单值、对象、数组。

     

    1.1 简单值

    • 字符串:"hello world"

    • 数值:10086

    • 布尔值:true

    • null:null

     

    1.2 对象

      JSON 要求给对象属性加上双引号,而且 JSON对象没有名字,末尾没有分号,因为这不是JavaScript语句:

    //这是一个JSON对象
    {
        "name": "Paykan",
        "age": 27
    }

    1.3 数组

      JSON数组和JavaScript数组一样: [25, "Paykan"],但是没有名字。可以把JSON数组和JSON对象组合起来:

    //这是一个JSON数组
    [
        {
            "name": "Paykan",
            "age": 27,
            "skill": ["HTML", "CSS", "JavaScript"]
        },
        {
            "name": "BarneyRoos",
            "age": 26,
            "skill": ["JSON", "Ajax", "Vue"]
        }
    ]

     

    二、解析与序列化

    正因为可以把 JSON 字符串解析为有用的 JavaScript 对象、数组等,所以 JSON 已经是 Web 开发中数据交换的事实标准。

    JavaScript 简单值和数组是不需要序列化的。JSON 简单值和数组也不需要解析即可在 JavaScript 中使用。

     

    2.1 JSON对象

    JavaScript 中有个 JSON 对象,专门用来处理 JSON 数据。JSON 对象有两个方法:
    • 序列化器:stringify(),用于把 JavaScript 值转换为 JSON 字符串

    • 解析器:parse(),用于把 JSON 字符串解析为 JavaScript 值

    //序列化器的使用
    //先定义一个JavaScript对象
    var book = {
        title: "Professional JavaScript",
        authors: ["Nicholas"],
        edition: 3,
        year: 2011
        say: function(){
            return this.title;
        }
    }
    ​
    //开始序列化
    var jsonText = JSON.stringify(book); 
    //"{"title":"Professional JavaScript","authors":["Nicholas"],"edition":3,"year":2011}"
    //注意,内层的双引号肯定是经过转义了的
    //开始解析
    var newBook = JSON.parse(jsonText); 
    //{title: "Professional JavaScript", authors: Array(1), edition: 3, year: 2011}

      在序列化 JavaScript 对象的时候,函数和原型对象成员会被忽略,值为 undefined 的属性也会被忽略。

     

    2.2 序列化选项

    stringify() 函数可以接收另外两个参数来控制序列化工作:过滤器、缩进选项

     

    2.2.1 过滤器

      过滤器用来指定工作方式,你可以让 stringify() 函数只转换特定的几个属性、可以规定遇见某个属性的时候做点什么事情,所以过滤器有两种:

    1. 数组:用来让 stringify() 函数只转换特定的几个属性

    //只转换上文中 book 对象的title和edition属性
    var jsonText = JSON.stringify(book, ["title", "edition"]);
    //"{"title":"Professional JavaScript","edition":3}"
    1. 函数:用来规定遇见某个属性的时候做点什么事情

    //当遇见title属性时,加上字符串 "3rd edition"
    //当遇见edition属性时,转换为undefined————不出现在JSON字符串中
    var jsonText = JSON.stringify(book, function(key, value){
        switch(key){
            case "title": return value + "3rd edition"; 
            case "edition": return undefined;
            default: return value;//注意:不需要处理的属性,一定要显式地返回其值
        }
    });
    //"{"title":"Professional JavaScript3rd edition","authors":["Nicholas"],"year":2011}"

     

    2.2.2 缩进选项

      在序列化 JavaScript 对象时,还可以保留源代码中的换行和缩进——只需要用一个整数指定缩进几个空格即可:

    //第二个参数如果不需要设置,就必须为null
    var jsonText = JSON.stringify(book, null, 4);
    /*
        "{
            "title": "Professional JavaScript",
            "authors": [
                "Nicholas"
            ],
            "edition": 3,
            "year": 2011
        }"
    */

     

    2.3 解析选项

      和序列化选项一样,在进行 JSON 对象解析时,也可以加上另外的参数来控制函数的工作。parse() 函数接收的第二个参数是一个函数,将在每个属性上调用:

    //现在把上文的jsonText解析成JavaScript对象,解析过程中加一点控制
    var newBook = JSON.parse(jsonText, function(key, value){
        if(key === "edition") {
            return value + "rd";
        }
        else{
            return value;   //注意:不需要处理的属性,一定要显式地返回其值,需要删除的属性,返回undefined
        }
    });

     

    小结

      JSON可以表示三种类型的数据:

    • 简单值:不能表示 undefined,不需要序列化和解析

    • 数组:和 JavaScript 数组一样,不需要序列化和解析

    • 对象:属性名需要加双括号

       JavaScript 对象序列化时可以用过滤器和缩进选项来控制序列化工作。

      解析 JSON 对象时可以用解析函数来控制解析工作。

     

  • 相关阅读:
    JQuery Div scrollTop ScrollHeight
    [转]docker快速搭建redis集群、zookeeper集群、activeMQ、fastdfs分布式存储教程
    Debian8安装OpenMediaVault3组建家庭NAS
    单片机按键处理方式(一)——典型的按键处理方式
    基于STC12系列单片机的通用红外遥控信号分析程序(一)
    8051系列单片机软件精确延时研究(二)
    8051系列单片机软件精确延时研究(一)
    4个74HC595级联控制16x16点阵横向滚动带仿真(二)
    4个74HC595级联控制16x16点阵横向滚动带仿真(一)
    Ubuntu 16.04下8051单片机开发环境搭建
  • 原文地址:https://www.cnblogs.com/MPK-dev/p/9551407.html
Copyright © 2020-2023  润新知