JavaScript快速入门-08-JSON

8 JSON

因平时工作时,使用JSON的场景比较多,其JSON语法不再介绍,仅介绍在JavaScript中JSON的解析和序列化。

8.1 JSON 对象

JSON对象有两个方法:

  • stringify():将JavaScript序列化为JSON字符串
  • parse():将JSON解析为原生JavaScript值
let personInfo={
    name:"Surpass",
    age:28,
    location:"Shanghai",
    from:"Wuhan",
    to:"Nanjing"
};

let jsonText=JSON.stringify(personInfo);
let jsonObj=JSON.parse(jsonText);
console.log(jsonText); // {"name":"Surpass","age":28,"location":"Shanghai","from":"Wuhan","to":"Nanjing"}
console.log(jsonObj); // {name: 'Surpass', age: 28, location: 'Shanghai', from: 'Wuhan', to: 'Nanjing'}

注意事项如下所示:

  • 在序列化JavaScript对象时,所有函数和原型成员都会在结果中省略,值为undefined的任何属性也会被跳过,最终得到的就是所有实例属性均为有效JSON数据类型的表示
  • JSON.parse()传入的JSON字符串无效,则会导致抛出错误

8.2 序列化选项

JSON.stringify()方法除了要序列化的对象,还可以接收两个参数,单独或组合使用这些参数可以更好地控制JSON序列化

  • 第一个参数是 过滤器,可以是数组或函数
  • 第二个参数是用于 缩进结果JSON字符串的选项

8.2.1 过滤结果

  • 1.过滤器为数组

如果第二个参数是一个数组,那么JSON.stringify()返回的结果只会包含该数组中列出的对象属性。

let personInfo={
    name:"Surpass",
    age:28,
    location:"Shanghai",
    from:"Wuhan",
    to:"Nanjing"
};

let jsonText=JSON.stringify(personInfo,["name","from"]);
console.log(jsonText); // {"name":"Surpass","from":"Wuhan"}
  • 2.过滤器是函数

如果第二个参数是一个函数,则函数接收两个参数: 属性名(key)和 属性值(value)。可以根据key决定要对其属性执行什么操作。key始终是字符串,当值不属于某个键/值对时则为空字符串。否则返回的值就是相应key对应的值。 若返回undefined会导致属性被忽略。代码如下所示:

let personInfo={
    name:"Surpass",
    age:28,
    location:"Shanghai",
    from:"Wuhan",
    to:"Nanjing"
};

let jsonText=JSON.stringify(personInfo,(key,value)=>{
   switch (key) {
       case "name":
           return value+"@";
       case "from":
           return value+"+";
        case "age":
            return value+28;
        case "location":
            return undefined;
       default:
           return value;
   }
});

console.log(jsonText);

输出结果如下所示:

{"name":"Surpass@","age":56,"from":"Wuhan+","to":"Nanjing"}

8.2.2 字符串缩进

JSON.stringify()方法的第三个参数控制缩进和空格。在这个参数是数值时,表示每一级缩进的空格数。示例代码如下所示:

let personInfo={
    name:"Surpass",
    age:28,
    location:"Shanghai",
    from:"Wuhan",
    to:"Nanjing"
};

let jsonText=JSON.stringify(personInfo,(key,value)=>{
   switch (key) {
       case "name":
           return value+"@";
       case "from":
           return value+"+";
        case "age":
            return value+28;
        case "location":
            return undefined;
       default:
           return value;
   }
},4);

console.log(jsonText);

输出结果如下所示:

{
    "name": "Surpass@",
    "age": 56,
    "from": "Wuhan+",
    "to": "Nanjing"
}

最大缩进值为10,大于10 的值会自动设置为10
如果缩进参数是一个字符串而非数值,那么JSON字符串中就会使用这个字符串而不是空格来缩进

let personInfo={
    name:"Surpass",
    age:28,
    location:"Shanghai",
    from:"Wuhan",
    to:"Nanjing"
};
let jsonText=JSON.stringify(personInfo,null,"++++");
console.log(jsonText);

输出结果如下所示:

{
++++"name": "Surpass",
++++"age": 28,
++++"location": "Shanghai",
++++"from": "Wuhan",
++++"to": "Nanjing"
}

8.3 解析选项

JSON.parse()方法也可以接收一个额外的参数,这个函数会针对每个键/值对都调用一次,也接收两个参数 属性名(key)和 属性值(value),同时也需要返回值。如果函数返回undefined,则结果中删除相应的键。如果返回了其他任何值,则该值就会成为相应键的值插入到结果中。

let personInfo={
    name:"Surpass",
    age:28,
    location:"Shanghai",
    from:"Wuhan",
    to:"Nanjing",
    neighbour:["Surpass"]
};

let neighbourArray=["Kevin","Tina","Jeniffer"];

let jsonText=JSON.stringify(personInfo);

let jsonObj=JSON.parse(jsonText,
    (key,value)=> key == "neighbour" ? neighbourArray:value
);

console.log(JSON.stringify(jsonObj,null,4));

输出结果如下所示:

{
    "name": "Surpass",
    "age": 28,
    "location": "Shanghai",
    "from": "Wuhan",
    "to": "Nanjing",
    "neighbour": [
        "Kevin",
        "Tina",
        "Jeniffer"
    ]
}

原文地址:https://www.jianshu.com/p/aca2b3177540

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

JavaScript快速入门-08-JSON

Original: https://www.cnblogs.com/surpassme/p/16641358.html
Author: Surpassme
Title: JavaScript快速入门-08-JSON

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581641/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Centos8安装docker报错(错误提示:All mirrors were tried)

    Centos8从零安装Docker-ce 背景:我把服务器整个yum源的配置文件里的内容全删了。因为我一直碰到”All mirrors were tried&#8221…

    Linux 2023年5月27日
    0155
  • 搭建redis集群

    这里总结性给出搭建步骤: 1、 至少6个节点,三主三从 2、 编译redis源码 3、放置集群的配置文件redis.conf 创建工作目录: 每个文件夹下新建redis.conf …

    Linux 2023年5月28日
    097
  • docker使用

    1 docker介绍,跟传统虚拟机的比较 2 docker架构图 3 docker安装 3.1 windows安装 3.2 乌班图 3.3 centos上安装(必须7.0以上) 3…

    Linux 2023年6月14日
    082
  • 搭建docker镜像仓库(一):使用registry搭建本地镜像仓库

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    086
  • winServer 监控Serv-U服务脚本(停止自动启动)

    Windows Server 服务器监控服务脚本,每60s查询一次,若服务停止即再启动 Serv-U 服务监控 脚本如下: @echo off rem 定&a…

    Linux 2023年6月7日
    090
  • docker网络模型

    [root@iZuf620p8rsr3faul3zsx6Z ~]# docker network –help Usage: docker network COMMAND Mana…

    Linux 2023年6月13日
    0123
  • JVM核心之JVM运行和类加载全过程

    为什么研究类加载全过程? 有助于连接JVM 运行过程 更深入了解java 动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM 把class 文件加载到内存,并对数据…

    Linux 2023年6月13日
    086
  • Redis 全局通用命令整理

    转载请注明出处: 1.查看所有键 该命令会存在线程阻塞问题,keys 命令也可以通过正则匹配获取存在的缓存数据 Redis从2.8版本后,提供了一个新的命令scan,它能有效的解决…

    Linux 2023年5月28日
    096
  • 【证券从业】金融基础知识-第三章 证券市场主体01

    注1:后续学习并整理到第八章,全书完结后再合并成一个笔记进行源文件分享 注2:本章内容巨多,大约分为三篇文章记录消化 posted @2022-06-01 22:20 陈景中 阅读…

    Linux 2023年6月13日
    0120
  • Linux下使用压力测试工具stress

    首先解压安装包到/usr/local/src/下 mv stress-1.0.4.tar.gz /usr/local/src​tar -zxf stress-1.0.4.tar.g…

    Linux 2023年6月13日
    089
  • 聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架。 它的设计异常优雅简洁,扩展性高,稳定性强。拥有非常详细完整的用户文档。 同时内置…

    Linux 2023年6月6日
    087
  • Kubernetes-DashBoard部署

    DashBoard 在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界…

    Linux 2023年6月13日
    096
  • Red Hat Enterprise Linux (RHEL) 8.5 发布(含下载)

    2021 年 11 月 10 日,红帽企业 Linux (RHEL) 8.5 现已正式发布 (GA),并带来了新功能和改进,以帮助简化部署、优化性能并帮助降低环境中的风险。无论您的…

    Linux 2023年5月27日
    0112
  • BootstrapTreeView 实现懒加载和点击事件。

    BootstrapTreeView的js下载位置:https://github.com/patternfly/patternfly-bootstrap-treeview。(注意不是…

    Linux 2023年6月7日
    0109
  • CentOS 7 新系统 手动配置网络 简要步骤

    一、配置网卡文件 1.修改网卡文件进入网卡配置文件目录 2.查看网卡文件 CentOS中网卡文件一般为 ifcfg-ens* 这样的文件,多块网卡会有多个类似文件 3.编辑网卡文件…

    Linux 2023年6月8日
    085
  • 【转】京东评价系统海量数据存储设计

    概述 京东的商品评论目前已达到数十亿条,每天提供的服务调用也有数十亿次,而这些数据每年还在成倍增长,而数据存储是其中最重要的部分之一,接下来就介绍下京东评论系统的数据存储是如何设计…

    Linux 2023年6月16日
    0132
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球