JSON格式数据
1. 基础知识
1. 什么是JSON格式?
JSON格式是现在网站数据交互的标准数据格式,写入标准。
- 取代原来的XML;符合JS原生语法,可以被直接解析,不需要额外的解析文件。
- 书写简单,一目了然
2. 合格的JSON数据
1.对象{...}
1)属性名必须是双引号的字符串;不能是Symbol类型;会被忽略
2)属性值不能是Date类型、函数、正则表达式、undefined、NaN、Infinity、-Infinity
JSON.stringify(value)的作用是将值转化为JSON的字符串形式。
JSON.stringify({a: new Date()});
// "{"a":"2019-10-12T15:16:13.833Z"}"
// new Date()由于toJSON()方法的存在,由对象变成了字符串类型,Date.parse()无法复原JSON
JSON.stringify({[symbol()]: 5}); // "{}" Symbol的属性被忽略
JSON.stringify({a: function(){}}); // "{}" function的属性值被忽略
JSON.stringify({a: undefined}); // "{}" undefined的属性值被忽略
JSON.stringify({a: /a/}); // "{"a": {}}" 正则表达式被解析成{}
JSON.stringify({a: NaN}); // "{"a": null}" NaN被解析成null
JSON.stringify({a: Infinity}); // "{"a": null}" Infinity被解析成null
JSON.stringify({a: -Infinity}); // "{"a": null}" -Infinity被解析成null
3)属性值如果含有字符串,必须全部是双引号
var obj={ //这是个对象,不是JSON
a: ['k','m'],
b: 'n',
c: {d: 'e'}
}
JSON.stringify(obj);
/* 标准的JSON格式如下:
"{
"a": ["k", "m"],
"b": "n",
"c": {"d": "e"}
}"
*/
4)对象不能循环引用,否则无法解析
let obj ={a: 1}
let obj2 = {b: 2};
obj.c = obj2;
obj2.d = obj;
JSON.stringify(obj2); //Uncaught TypeError: Converting circular structure to JSON
5) 合格的JSON格式数据最后一个元素后面不能有,
JSON.stringify({a:1,}); // "{"a":1}" 转为JSON格式,逗号消失,说明JSON不能有逗号
2. 数组[]
数组的元素不能是Date,Symbol,RegExp,function,NaN,undefined,Infinity,-Infinity。
除了正则表达式会被解析成{ }, 其余6个都会被解析成null
最后一个元素后面不能有逗号(,)
JSON.stringify([Symbol(), undefined, NaN, Infinity,-Infinity,function(){}, /a/]);
// "[null,null,null,null,null,null,{}]"
3. 原始数据类型
字符串、数字(十进制)、布尔值、null
JSON.stringify('true');// ""true"" 将字符串单引号变为双引号,再字符串化
JSON.stringify('true') === "\"true\"" ;// true
JSON.stringify(0x99); // "153" 不能是十进制以外的数字,会被自动转为十进制,通过JSON.parse()无法还原
JSON.stringify(99); //"99"
JSON.stringify(true); // "true"
JSON.stringify(null); //"null"
❎不能是:Symbol、undefined、NaN、Infinity、-Infinity
前两个会被忽略,和空函数一样,默认返回undefined
后面的会被解析成null
JSON.stringify(Symbol()); // undefined
JSON.stringify(undefined);// undefined
JSON.stringify(NaN); // "null"
JSON.stringify(Infinity); // "null"
JSON.stringify(-Infinity); // "null"
2. JSON.stringify(value[, replacer, space])
该方法将任意类型的值,转为JSON对象的字符串格式。
1)如果对象有自定义的toJSON方法,value将是toJSON的返回值
Date对象原生含有toJSON()方法。将对象转为字符串,所以Date对象不能作为JSON格式的值。
// 自定义toJSON()方法
var obj={
a: 1,
toJSON(){
return {c:1}
}
};
JSON.stringify(obj); //"{"c":1}"
2)当value是对象时,会过滤掉不可遍历属性
var obj = {};
Object.defineProperties(obj, {
"foo": {
value: 5,
enumerable: false
},
"bar": {
value: 6,
enumerable: true
}
});
obj; // {foo: 5, bar; 6}
JSON.stringify(obj); // "{"bar": 6}"
3) 第二个参数可以是数组,只有当value是对象时,表示可以遍历的属性;
起过滤作用! 可以过滤掉循环引用的属性。
var obj = {
foo: {bar: 5},
bar: {foo: 6},
tar: 7
};
JSON.stringify(obj, ['foo']); // "{"foo": {}}" 因为第二个参数规定了只序列化foo属性,嵌套的属性也适用该规则
第二个参数还可以是函数function(key,value){},用于处理数据;而且可以递归处理所有的属性。
该函数默认形式是:
funtion(key,value){
return value;
}
不论第一个参数是什么类型的值,函数第一次处理的key都没有对应,value是本身;
如果返回的value值不是原始数据类型,则递归调用函数,函数对应的处理对象都是上次返回的结果。
a. 当value是对象时,key,value对应对象的键值对
JSON.stringify({a:1,b:2}, function(key,value) {
console.log("key=",key, "value=",value);
return value
}) // "{"a":1,"b":2}"
// key= value= {a: 1, b: 2}
// key= a value= 1
// key= b value= 2
JSON.stringify({a:1,b:2}, function(key,value) {
if(typeof value === 'number') {
value += 10;
}
return value;
}); // "{"a": 11, "b":12}"
b. 当value是数组时,key对应数组下标, value对应值
JSON.stringify([1,2], function(key,value){
console.log("key=",key, "value=",value);
return value;
}) //"[1,2]"
// key= value= [1, 2]
// key= 0 value= 1
// key= 1 value= 2
c. 当value是原始类型的值时, 不需要递归调用
JSON.stringify(5, function(key,value){ return value+5}) //"10"
JSON.stringify('5', function(key,value){ return value+5}) // "55"
4)第三个参数主要用来增加可读性,调整返回格式;
如果参数是一个数字(<10),表示在返回的属性面前的空格数量;
JSON.stringify({a: {b:1}}, function(key,value) {
return value
}, 4);
/*
"{
"a": {
"b": 1
}
}
*/
如果参数是一个字符串(length<10), 表示在属性前面添加该字符串
JSON.stringify({a: {b:1}}, function(key,value) {
return value
}, '|--');
/*
"{
|--"a": {
|--|--"b": 1
|--}
}"
*/
3.JSON.parse(value[, function(key,value){}])
JSON.parse(value)将JSON对象的字符串形式,转为JSON对象;
value必须是合格JSON数据的字符串,否则会抛出异常!
所以JSON.parse方法在不能确认参数是否正常的情况下,应该try...catch...
try{
JSON.parse("'test'");
// 最外层的引号是字符串格式,里面是JSON数据'test',单引号抛出异常
} catch {
console.log("参数格式错误");
}
// 其实如果是('"test"')不会抛出异常,字符串包含的是JSON数据"test"
第二个参数的用法同JSON.stringify()的第二个参数是函数的用法。
JSON格式数据的更多相关文章
- iOS开发之JSON格式数据的生成与解析
本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...
- 解析json格式数据
实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...
- ios网络学习------6 json格式数据的请求处理
ios网络学习------6 json格式数据的请求处理 分类: IOS2014-06-30 20:33 471人阅读 评论(3) 收藏 举报 #import "MainViewContro ...
- fastJson java后台转换json格式数据
什么事JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Progra ...
- ajax请求后台,返回json格式数据,模板!
添加一个用户的时候,需要找出公司下所有的部门,和相应部门下的角色,利用ajax请求,实现联动技术.将返回的json格式数据,添加到select标签下. <script type="te ...
- 使用C#中JavaScriptSerializer类将对象转换为Json格式数据
将对象转换为json格式字符串: private JavaScriptSerializer serializer = new JavaScriptSerializer(); protected voi ...
- 使用getJSON()方法异步加载JSON格式数据
使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数组,并对获取的数据进行解析,显示在页面中,它的调用格式为: jQuery. ...
- Ajax返回html和json格式数据
Ajax可以返回text和xml格式 可以用Ajax返回大段的html文本和json格式的字符串,然后用eval()方法 转化为json对象 php中的json编码:json_encode(); ph ...
- 实现android上解析Json格式数据功能
实现android上解析Json格式数据功能,该源码转载于安卓教程网的,http://android.662p.com ,个人感觉还不错的,大家可以看看一下吧. package com.practic ...
- 在JSP页面中输出JSON格式数据
JSON-taglib是一套使在JSP页面中输出JSON格式数据的标签库. JSON-taglib主页: http://json-taglib.sourceforge.net/index.html J ...
随机推荐
- Django之Form与ModelForm组件
Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...
- 笔记-8:使用turtle库进行图形绘制
1.窗体函数 turtle.setup(width,height,startx,starty) 作用:设置窗体的大小和位置 width:窗口宽度,如果值是整数,表示像素值:如果值是小数,表示窗口宽度与 ...
- delete删除数据造成归档日志增加,操作系统空间不足导致数据库hang住
业务需求,对日志表历史数据进行清理.历史表均很大,使用delete 操作删除90天前的数据. 第一部分:快速删除数据 SQL> alter table CC.F_LOG parallel ; S ...
- 简单二次封装的Golang图像处理库:图片裁剪
简单二次封装的Golang图像处理库:图片裁剪 一.功能 Go语言下的官方图像处理库 简单封装后对jpg和png图像进行缩放/裁剪的库 二.使用说明 1.首先下载 go get -v -u githu ...
- hdu 1285 拓扑
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 【SQL Server性能优化】删除大量数据的方法比较
原文:[SQL Server性能优化]删除大量数据的方法比较 如果你要删除表中的大量数据,这个大量一般是指删除大于10%的记录,那么如何删除,效率才会比较高呢? 而如何删除才会对系统的影响相对较小呢? ...
- numix Docky
今天我们介绍这款主题适用于 Docky 启动器的 numix 主题,关于 Docky 大家已经应该很熟悉了,一款类似 Mac 底部软件停放的快捷启动码头.如图: 这款主题是 Docky 的主题,如果你 ...
- VBA决策(十)
决策允许程序员控制脚本或其中一个部分的执行流程.执行由一个或多个条件语句控制.以下是在大多数编程语言中找到的典型决策结构的一般形式. VBA提供了以下类型的决策声明. 点击以下链接来查看它们的详细信息 ...
- C#基础 冒泡排序
冒泡排序 依次比较相邻的两个数,将小数放在前面,大数放在后面. 对数组中两个变量进行交换,是冒泡排序中最基本的步骤 //数组中两个变量进行交换 ,,}; ]; s [] = s [s.Length-] ...
- centos7防火墙相关
selinux(保护文件安全) 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统. SE ...