JSON是什么呢?

2023-10-27

写这篇文章的缘由

你了解JSON嘛?JSON是JavaScript中对象嘛?JSON可以存储function对象嘛?JSON的本质是什么呢?JSON能写注释嘛?
如果你都能答上来,那恭喜你,你对JSON了解的很测底,如果你有写不太明白,哪有必要和我一起来探讨JSON

我之前对JSON的概念也是一知半解,常常和JavaScript的Object对象混淆,所以就导致了很多种种的错误,特别是在研究NodeJS中,有一个叫package.json的文件专门用来存储json格式的数据。如果你在这个文件里面写注释,或者存储函数,最终解析这个文件时就会报错。

然后自己查阅了些相关的资料,得出些结论。现在拿出来和大家分享一下,同时,假如文章中有纰漏的地方,大家可以帮我指点纠正下。

JSON是什么

首先我们来看看官方是怎么描述JSON的:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。参考来源地址:http://www.json.org/json-zh.html。

官方的说法,也不是特别的明了,只说明了这是一种轻量级的数据交换格式,且基于JavaScript一个子集。这根本说明不了什么?不过我联想到了另外一种数据交换格式,那就是xml,这个格式特别在webService中被大量使用。xml是什么呢,其本质是一种DOM结构。对比一下,那json本质就是字符串了,不过这个字符串不是不同的字符串,它有一些列的语法和结构。下面我们就介绍下其语法。

JSON的语法介绍

常见JSON数据结构有两种形式,其分别是:

  • “名称/值”对的集合,类似JavaScript中的对象。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

首先来看第一种情况:对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

object.gif

这和JavaScript中的对象字面量比较类似,但是本质上还是有些区别的。比如对象中的名称(或者称为key)是必须用双引号括起来的。单引号都不行,更别说忽略它了,虽然JavaScript中的对象中的名称值常常忽略双引号。比如

{
    name : 'test',
    age  : 123,
    success : function(){
        //todo
    }
}

则在JSON中是行不通的。除了"名称(key)"值有限制外,对象中的"值(value)"也做了限制,比如在JavaScript中的对象字面量中的值可以随便赋值,不管是字符串、数组、函数、整形都是可以的。JSON中的取值可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array),
value.gif

除此之外,这些值以外都会被解析出问题,像刚才头中提到的,如果给JSON的值赋值一个function是一个错误的行为。

接下来,看看值的有序列表(或者称为数组),数组是值的有序列表,一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔,并且值的限制情况在上面中已经提到。

array.gif

差不多把语法介绍完了,总结一下,JSON其本质是一串有意义的字符串数据交互格式。呵呵,不知道我定义的正不正确。

JavaScript语言中JSON的解析和序列化

在JavaScript中经常是要对JSON进行处理的,比如提交一个数据前常常需要对其进行序列化处理,从后来拉过来的JSON数据,我们经常要对它进行解析然后得到一个JavaScript对象。可能由于大家经常使用一些JavaScript类库,这些库对JSON的操作做了封装,所以造成一种现象,那就是我们只会用,对齐本质,我们了解甚少。现在我们就抛开类库,了解其底层的本质。

早期的JSON解析器通过JavaScript中eval()函数来解析的。直到ECMA5对齐进行了规范,并且定义了一个全局的JSON对象用来对JSON进行解析和序列化。支持JSON这个全局对象的浏览器包括IE8+、FF3.5+、Safari4+、Chrome和Opera10.5+。对于不支持这个对象的浏览器比如IE6、IE7怎么做处理呢?

不用担心,JSON的发明者早就帮我们实现了兼容的代码,其地址为:https://github.com/douglascrockford/JSON-js。对于不支持原生的JSON对象的。我们可以引入这段代码解决兼容性的问题。

JSON有两个主要方法,用来解决JSON的序列化和解析,其分别是stringfyparse.让我们分别来看看它们的用法。

ECMA5定义的标准接口如下所示:

/**
@param {*} value
@param {Function} [replacer]
@param {Number|String} [space]
@static
*/
JSON.stringify = function(value,replacer,space) {};

其中对一个参数是必须滴,而且是我们要进行序列化的对象。示例代码如下所示:

var obj = {
    name : 'hello',
    age  : 18
}

var jsonText = JSON.stringify(obj)    //输出:{"name":"hello","age":18}

第二个参数是可选项,可以是函数或者是数组。如果是数组,那么数组中指定是过滤项,以上面例子为例,进行如下调用:

var jsonText = JSON.stringify(obj,["name"])     //输出: {"name":"hello"}

如果是函数的话,回调函数里面的参数对应Javascript中对象里面的keyvalue值。示例如下:

var jsonText = JSON.stringify(obj,function(key,value){
    switch(key) {
        case "name": return value+" json";
        case "age" : return 20;
        default : return value;
    }
});
//输出 {"name":"hello json","age":20}

第三个参数也是可选的。用来进行字符串缩进,示例如下:

var jsonText = JSON.stringify(obj,null,4); //按4个空格缩进

//输出的结果不再是单行,而是下面的形式:
{
    "name" : "hello",
    "age" :  18
}

除了可以设置数字外,还可以用字符设置缩进,有兴趣大家可以尝试一下。

ECMA5对parse接口的定义如下:

/**
@param {string} jsonString
@param {Function} [reviver]
@static
*/
JSON.parse = function(jsonString,reviver) {};

该方法接受两个参数,其中第二个参数是可选的。

第一个参数的作用是待转换的JSON字符串。比如我们可以将上面的jsonText通过parse还原成原来的Javascript对象。

var obj = JSON.parse(jsonText); //obj为JavaScript对象。

第二个参数是一个函数,用来更加细微的控制转换过程。它接受两个参数,分别对应着JSON数据的键值对。调用示例如下:

   var obj = JSON.parse(jsonText,function(key,value){
        //todo
    }); 

帮助链接

JSON中文官网

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON是什么呢? 的相关文章

  • vue运行后没有显示内容

    运行成功没有报错但是就是不显示内容 进浏览器看到控制台的报错信息 vue runtime esm js c320 4573 Vue warn Property or method yzmStr is not defined on the i
  • 如何使用cookie信息,完成自动登录

    在做爬虫任务的时候 我们常常会遇到很多网页必须登录后 才可以开放某些页面 所以登录是爬取网页的第一步 但是 通过post表单 包含用户名和密码 的方法 对于那些不需要输入比较复杂的验证码的网页 可以使用正则表达式将验证码和验证码的ID匹配得
  • MMEditing环境配置

    MMEditing环境配置 MMEditing is an open source image and video editing toolbox based on PyTorch It is a part of the OpenMMLab
  • ZynqMP Petalinux2021.1设置工程离线编译

    前言 Ubuntu18 04安装Petalinux 2021 1 sudaroot的博客 CSDN博客 介绍 PetaLinux基于Yocto 每次创建或者编译工程下载都需要联网下载工程所需文件 且下载的文件非常庞大 这就导致编译速度还受网
  • 《Python量化投资》01 量化投资之单因子测试(概述,Pandas的适用)

    一 股票aplha多因子策略介绍 量化投资是指通过数量化方式及计算机程序化发出买卖指令 以获取稳定收益为目的的交易方式 在海外的发展已有30多年的历史 其投资业绩稳定 市场规模和份额不断扩大 得到了越来越多投资者认可 从全球市场的参与主体来
  • C#简单操作MongoDB

    新建一个窗体程序 使用Nuget安装mongodb driver 或者直接引用dll如下 代码 using System using System Collections Generic using System ComponentMode
  • Shader编程学习笔记(二)—— Shader和渲染管线

    http www cnblogs com maple share p 5395097 html Shader和渲染管线 什么是Shader Shader 中文翻译即着色器 是一种较为短小的程序片段 用于告诉图形硬件如何计算和输出图像 过去由
  • i2c

    I2C是由Philips公司发明的一种串行数据通信协议 仅使用两根信号线 SerialClock 简称SCL 和SerialData 简称SDA I2C是总线结构 1个Master 1个或多个Slave 各Slave设备以7位地址区分 地址
  • 使用Python3解压gz、tar、tgz、zip、rar五种格式的压缩文件例子

    使用Python3解压如下五种压缩文件 gz tar tgz zip rar 简介 gz 即gzip 通常只能压缩一个文件 与tar结合起来就可以实现先打包 再压缩 tar linux系统下的打包工具 只打包 不压缩 tgz 即tar gz
  • Chrome-网页另存为单个网页文件后,单个网页文件无法正常显示的问题

    通过Chrome浏览器另存单个网页文件 再次打开出现时出现下图效果 将存储的单个网页文件的扩展名由html修改为mhtml即解决该问题
  • 数据库的可伸缩性的探索

    数据库的可伸缩性的探索 Author skate Time 2009 5 30 数据库在当今社会越来越重要 尤其对于一个发展迅速的企业 其数据是爆炸式的发展 为了适应其数据的发展 对数据库的架构体系设计要求也越来越高 它要可以方便的线形扩展
  • Windows 安装pdf2image运行后遇到PDFInfoNotInstalledError解决办法

    最近在学习图像处理 需要安装pdf2image 安装没有报错 运行之后报错 pdf2image exceptions PDFInfoNotInstalledError Unable to get page count Is poppler
  • UE4_运行模式下(Runtime)样条曲线(Spline)新增Point导致Length变长

    Spline 在运行模式下新增一个point引发的问题 问题描述 在Spline曲线之间增加一个Point 导致Spline的Length变长 产生的原因 Spline 之前本身具有2个Point 博主想通过鼠标点击的方式在曲线之间产生一个
  • WebAPI中使用Autofac (过滤器的注册)

    第一步 在webAPI中安装 Autofac WebApi2 不要错误的安装Autofac Mvc5 也不要错误的安装Autofac WebApi 因为Autofac WebApi是给webapi1的 否则会报错 重写成员 Autofac
  • Sqlite中使用SQL与其他数据库的区别

    Sqlite作为Android中的主流数据库而广为使用 但是他的sql语言与一般的大型数据库所使用的SQL语言还是有一些区别的 本文总结如下 1 TOP 在SQL Server中 我们使用TOP来获取前N条数据 SELECT TOP 10
  • 解决QT程序发布时的dll依赖问题

    在QT程序发布时 往往需要解决程序中的DLL动态链接库的依赖问题 否则 因为开发机器的运行环境和客户机器不一样 因此到了客户那里可能会出现缺少DLL的问题 qt creator windows操作系统 visual studio 2015
  • Educoder–Java面向对象(第七章+第八章)- Java中的异常与文件类【笔记+参考代码】

    Educoder Java面向对象 第七章 第八章 Java中的异常与文件类 笔记 参考代码 一 Java中的异常 一 第一关 1 在Java中 源文件Test java中包含如下代码段 则程序编译运行结果是 B public class
  • 图形库LVGL v8.2版本移植

    图形库LVGL v8 2版本移植 环境 硬件 前提准备 下载图形库代码 图形开发中的字体转换 图片转换 GUI GUIDER 图形化开发lvgl 移植 加入相关源代码到工程中 提供时钟信号给lvgl 使用GUI Guider 生成代码 并加
  • Python多线程thread与threading实现

    Python多线程thread与threading实现 python是支持多线程的 并且是native的线程 主要是通过thread和threading这两个模块来实现的 python的thread模块是比较底层的模块 python的thr
  • 1074 Reversing Linked List (25)(25 分)

    include

随机推荐

  • python模块和包(模块、包、发布模块)

    模块和包 目标 模块 包 发布模块 01 模块 1 1 模块的概念 模块是 Python 程序架构的一个核心概念 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块 模块名 同样也是一个 标识符 需要符合标识符的命名规则
  • chatgpt赋能python:如何使用Python编写游戏-一个完整的指南

    如何使用Python编写游戏 一个完整的指南 Python是一个非常受欢迎的编程语言 它可以用于开发各种类型的应用程序 包括游戏 Python具有易学易用的特点 而且编写游戏时会更加便捷 在本文中 我们将介绍如何使用Python编写游戏 选
  • 【Leetcode刷题】141、环形链表

    原题链接 https leetcode cn problems linked list cycle favorite 2cktkvj 给你一个链表的头节点 head 判断链表中是否有环 如果链表中有某个节点 可以通过连续跟踪 next 指针
  • 软件测试工程师的职责是什么?

    一 测试工程师 1 国内定位和发展前景 测试工程师 软件质量的把关者 工作起点高 发展空间大 我国的软件测试职业还处于一个发展的阶段 所以测试工程师具有较大发展前景 目前传统的软件行业还是以软件测试工程师为主 但是在新兴的互联网行业大多还是
  • Rider For Unreal 常用快捷键与基础操作整理

    相较于VS常用快捷键 整理一下Rider中目前比較常用的快捷鍵 欢迎私信或评论补充 确实常用的話我會立即加上 小白级操作指导 操作 快捷鍵 编译 Ctrl F9 编译並运行 Shift F10 快速切换声明与实现 Ctrl B 快速添加所需
  • git上传大文件

    注意 免费版的 Gitee 不支持 LFS 需要企业版账户 下载一个git lfs 插件 官网 https git lfs github com 安装路径一定要注意 你的本地 Git 目录下的 bin 以我为例 D Porgram IT G
  • ngix反向代理配置(长连接)

    各位有没有遇到 一般的代理服务器 在运行程序时候 经常会出现服务器连接不上的问题 问题的原因 是代理服务器没有配置长连接 下文就是小编为了解决此问题 通过使用nginx配置做一个代理的中转 跳转到外部的计算机上 场景是小编有一台a计算机 b
  • 程序员修炼之道:从小工到专家九月第一篇

    这半个多月 从老师介绍给我们这本书之后 我在网上又读了写别人的体验与感受 感觉收益颇丰 我虽然刚开始读 但是里面有一些名言警句感觉和我们练习的十分紧密 第一句呢就是你说什么和你怎么做同等重要 这是从别人那看来的 书上写道 如果你不能有效的向
  • sklearn.metrics【指标】

    分类指标 1 accuracy score y true y pre 精度 2 auc x y reorder False ROC曲线下的面积 较大的AUC代表了较好的performance 3 average precision scor
  • (进制,类型)This指向

    进制 类型 This指向 进制 类型 this js中属性名key this key window key 题目练习 题 new this指向补充 进制 类型 数字类型number 布尔类型boolean 字符串类型string undef
  • 在Windows10系统配置WSL

    前言废话 在电脑上需要LINUX开发的时候 由于虚拟机无法直接连接到电脑主机的显卡 无法在LINUX上进行CUDA编程 所以如果需要在该电脑进行LINUX的CUDA开发 配置一个wsl就显得十分重要 本次配置是在一台 刚装过vs c 和CU
  • 优惠券列表 crmeb开发api接口文档

    优惠券列表 基本信息 Path api coupons Method GET 接口描述 请求参数 Query 参数名称 是否必须 示例 备注 page 否 分页参数起始值 limit 否 分页数步长值 type 否 0 所有优惠券 默认 1
  • mvn 手动编译jar包 为pom依赖

    mvn install install file Dfile upload jar DgroupId com qiniu util DartifactId upload Dversion 1 0 Dpackaging jar Dgenera
  • 【面经】华为OD软件测试

    本人山东双非一本 二战失利后参加工作 面试时参考了网上很多面经 前人栽树后人乘凉 写一下自己的面试经历 2 16 机试 总分400 两道简单题各100分 一道中等题200分 每题按照通过样例百分比计分 150分通过 建议尽可能多拿分 可能会
  • 2003服务器怎么修改域,如何降级Windows 2003 server域控制器

    1 单击开始 单击运行键入 dcpromo 然后单击确定 2 这样就启动了 Active Directory 安装向导 单击下一步 3 删除 Active Directory 屏幕上有一个复选框 如果此计算机是域中的最后一个域控制器 则请单
  • 解决 Plugin [id: ‘com.android.application‘, version: ‘x.x.x‘, apply: false] was not found ......

    步骤一 查看一下你的gradle对应的JDK版本是否过低 目前8 0版本对应的是JDK17 步骤二 如果是下载失败 可以在settings gradle中的添加镜像地址 以下是我的项目中的例子 pluginManagement reposi
  • word2vec

    import pandas as pd import json import jieba import gensim from gensim models word2vec import LineSentence from gensim m
  • TCP/IP SOCKET HTTP

    网络七层由下往上分别为物理层 数据链路层 网络层 传输层 会话层 表示层和应用层 其中物理层 数据链路层和网络层通常被称作媒体层 是网络工程师所研究的对象 传输层 会话层 表示层和应用层则被称作主机层 是用户所面向和关心的内容 http协议
  • ① 尚品汇的前台开发笔记【尚硅谷】【Vue】

    文章目录 一 采用vue cli去初始化项目 二 项目的其他配置 三 项目路由的分析 四 完成非路由组件Header与Footer业务 开发项目的步骤 使用组件的步骤 非路由组件 完成路由组件的搭建 Footer组件显示与隐藏 路由传参 路
  • JSON是什么呢?

    写这篇文章的缘由 你了解JSON嘛 JSON是JavaScript中对象嘛 JSON可以存储function对象嘛 JSON的本质是什么呢 JSON能写注释嘛 如果你都能答上来 那恭喜你 你对JSON了解的很测底 如果你有写不太明白 哪有必