本篇内容主要讲解“JSON.parse和JSON.stringify怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JSON.parse和JSON.stringify怎么使用”吧!
JSON格式,(简写JavaScript Object Notation),是一种用于数据交换的文本格式,书写简单。
基于JavaScript原生语法,能够序列化对象、数组、数值、字符串、布尔值和 null。
在ES5中,增加了一个JSON对象,专门用来处理JSON格式的数据。
JSON是一个对象,但只有两个方法:parse
和 stringify
,不能作为构造函数,也无属性。
typeof JSON === 'object'
JSON.parse
JSON.parse()
用来解析JSON字符串,得到对应的JavaScript值或对象。
JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('null') // null
JSON.parse 语法
JSON.parse(text[, reviver])
text:要被解析成的字符串。
如果传入数字则会转换成十进制数字输出。
如果传入布尔值则直接输出。
如果传入null则输出null。
不支持其他类型的值,否则报错。
reviver: 可选,转换器, 可以用来修改解析生成的原始值。
返回值: JavaScript对象/值, 对应给定JSON文本的对象/值。
reviver 参数
reviver函数,用于转换处理解析到的JavaScript值,处理完后返回最终的结果。
转换过程:
解析的值本身和它可能包含的所有属性,按照一定遍历顺序分别调用reviver函数,属性名和值作为参数两个参数 key
和 value
传入。
遍历顺序:按照层级,从内往外遍历,最终到达最顶层,则是解析值本身。
reviver返回undefined,则删除该对象,如果返回了其他值,则该值会成为当前属性的新值。
当遍历到最顶层时,因为没有属性了,参数key是空字符串''
,参数value则是当前解析值。
对于reviver函数的两个参数 key
和 value
,不同的数据类型:
基本值类型数据(string、number、boolean)和null,以及空对象{}
和空数组[]
:
则key是空字符串,value是对应解析值。
因为已经是最顶层,并没有别的属性。
Object对象:
则key和value都存在,与属性名和值各自对应。
最顶层会返回一个参数key为空的值。
数组:
key对应数组索引,value对应元素值。
最顶层会返回一个参数key为空的值。
基本类型的转换:
JSON.parse('5', function (key, value) {
console.log(`key:${key}, value:${value}`)
})
// key:, value:5
JSON.parse('null', function (key, value) {
console.log(`key:${key}, value:${value}`)
})
// key:, value:null
JSON.parse('{}', function (key, value) {
console.log(`key:${key}, value:`, value)
})
// key:, value:{}
Object对象和数组:
JSON.parse('[1, 2]', function (key, value) {
console.log(`key:${key}, value:`, value)
})
// key:0, value: 1
// key:1, value: 2
// key:, value: (2) [empty × 2]
JSON.parse('{ "user": "张三", "info": { "age": 25, "sex": 1 } }', function (key, value) {
console.log(`key:${key}, value::`, value)
})
// key:user, value:: 张三
// key:age, value:: 25
// key:sex, value:: 1
// key:info, value:: {}
// key:, value:: {}
数据处理:
JSON.parse('[1, 2]', function (key, value) {
if(key === '') {
return value
}
return value + 3
})
// [4, 5]
JSON.parse 特性
在解析JSON字符串的时候,需要注意到JSON格式的一些规范,不然就容易报错。
JSON数据对值的类型和格式,都有严格的规定,具体的规则如下:
JSON.parse('"中国"')
// '中国'
JSON.parse(null) // null
JSON.parse(111.) // 111
JSON.parse(0x12) // 18
JSON.parse(true) // true
JSON.parse([])
// Uncaught SyntaxError: Unexpected end of JSON input
JSON.parse('"String"')
// 'String'
JSON.parse('\'String\'')
// Uncaught SyntaxError: Unexpected token ' in JSON at position 0
JSON.parse('111') // 111
JSON.parse('0x12')
// Uncaught SyntaxError: Unexpected token x in JSON at position 1
JSON.parse('111.232') // 111.232
JSON.parse('111.')
// Uncaught SyntaxError: Unexpected end of JSON input
JSON.parse(undefined)
// Uncaught SyntaxError: Unexpected token u in JSON at position 0
JSON.parse(Symbol())
// Uncaught TypeError: Cannot convert a Symbol value to a string
JSON.parse('12n')
// Uncaught SyntaxError: Unexpected token n in JSON at position 2
JSON.parse('[]')
// []
JSON.parse('Object()')
// Uncaught SyntaxError: Unexpected token O in JSON at position 0
JSON.parse('{"key": 1 }')
// {key: 1}
JSON.parse('{key: 1 }')
// Uncaught SyntaxError: Unexpected token k in JSON at position 1
JSON.parse('[1, 2, 3, 4, ]')
// VM2771:1 Uncaught SyntaxError: Unexpected token ] in JSON at position 13
JSON.parse('{"key" : 1, }')
// VM2779:1 Uncaught SyntaxError: Unexpected token } in JSON at position 12
JSON.parse('{"\u0066":333}')
// {f: 333}
JSON.parse('"\n"')
// Uncaught SyntaxError: Unexpected token
解析的其他方法
将json字符串转成json对象(js对象值),还可以使用其他方法,但是非安全代码。
const str = '{"name":"json","age":18}'
const json = JSON.parse(str)
const json = eval("(" + str + ")")
const json = (new Function("return " + str))()
JSON.stringify
JSON.stringify()
将一个JavaScript对象或值转换为JSON格式字符串。
JSON.stringify 语法
JSON.stringify(value[, replacer [, space]])
返回值: 一个表示给定值的JSON格式字符串。
replacer参数
replacer 参数可以以下三种情况:
JSON.stringify({key: 'json'}, null, null) // '{"key":"json"}'
JSON.stringify({key: 'json'}, true) // '{"key":"json"}'
const obj = {
json: 'JSON',
parse: 'PARSE',
stringify: 'STRINGIFY'
}
JSON.stringify(obj, ['parse', 'stringify'])
// '{"parse":"PARSE","stringify":"STRINGIFY"}'
处理过程:
函数有两个参数,属性名(key)和属性值(value),都会被序列化;
第一次调用时,key为空字符串,value则为需要序列化的整个对象;
第二次处理时,会把第一次的的结果传过来,后续的每一次的处理都将接收上一次处理的结果;
后面,将依次处理每个属性名和属性值,完成后返回。
JSON.stringify({ json: 1, stringify: { val: 'rr'} }, (key, value) => {
console.log(`key:${key},value:`, value)
return value
})
// key:,value: {json: 1, stringify: {…}}
// key:json,value: 1
// key:stringify,value: {val: 'rr'}
// key:val,value: rr
// '{"json":1,"stringify":{"val":"rr"}}'
value的类型处理:
如果返回基本类型字符串、数字、布尔值、null,则直接被添加到序列化后的JSON字符串中;
如果返回其他对象,则会在后续依次序列化该对象的属性,如果是函数则不作处理;
如果返回或undefined,则不会输出该属性。
序列化数组时,如果value返回undefined或者一个函数,将会被null取代。
JSON.stringify({ json: 1, stringify: 'rr' }, (key, value) => {
if (typeof value === 'number') {
return 'ss'
}
return value
})
// '{"json":"ss","stringify":"rr"}'
JSON.stringify({ json: 1, stringify: 'rr' }, (key, value) => {
if (typeof value === 'number') {
value = undefined
}
return value
})
// '{"stringify":"rr"}'
下面示例,是返回对象值时的处理:
JSON.stringify({ json: 1, stringify: 'rr' }, (key, value) => {
if (typeof value === 'object') { // 第一次返回整个对象时,类型是object
return { parse: 'dd' }
}
return value
})
'{"parse":"dd"}'
space 参数
space 参数用来控制结果字符串里面的间距,美化输出。可以输入的值有以下三种情况:
如果是一个数字, 序列化时,每一层级比上一层级多缩进对应数字值的空格,范围在 1 - 10,即最小1个最大10个空格;
如果是一个字符串,序列化时,该字符串会添加在每行前面,每一层级比上一层级多缩进该字符串,最多是个字符,超过则截取字符串;
如果是null、undefined或其他类型,则被忽略,不做处理。
JSON.stringify({key: 'json'}, null, 2)
// '{\n "key": "json"\n}'
JSON.stringify({key: 'json', list: { str: 'str' } }, null, '|-')
// '{\n|-"key": "json",\n|-"list": {\n|-|-"str": "str"\n|-}\n}'
JSON.stringify({key: 'json'}, null, null)
// '{"key":"json"}'
JSON.stringify 特性
JSON.stringify(333) // '333'
JSON.stringify(true) // 'true'
JSON.stringify(new String('333')) //'"333"'
JSON.stringify(Boolean(true)) // 'true'
JSON.stringify('json') === 'json' // false
JSON.stringify('json') === '"json"' // true
出现在Object对象中时,会被忽略;
出现在数组中时,会被序列化成null;
单独出现时,会返回undefined。
JSON.stringify(Symbol()) // undefined
JSON.stringify([Symbol(), Math.abs, undefined]) // '[null,null,null]'
JSON.stringify({ [Symbol()]: Math.abs, key: undefined }) // '{}'
JSON.stringify(null) // 'null'
JSON.stringify(NaN) // 'null'
const obj = {}
Object.defineProperties(obj, {
'json': { value: 'JSON', enumerable: true },
'stringify': { value: 'STRINGIFY', enumerable: false }
})
JSON.stringify(obj)
// '{"json":"JSON"}'
JSON.stringify({[Symbol()]: 333}) // '{}'
const a = { '1': 911, 'r': 822, '11': 9922}
JSON.stringify(a)
// '{"1":911,"11":9922,"r":822}'
const a = { key: 'json' }
a.toJSON = () => 'JSON'
JSON.stringify(a)
// '"JSON"'
JSON.stringify(/\d/) // "{}"
JSON.stringify(new Error()) // "{}"
想要序列化相应对象,需要设置实现toJSON方法才行。
RegExp.prototype.toJSON = RegExp.prototype.toString
JSON.stringify(/\d/) // '"/\\\\d/"'
JSON.stringify(new Date())
// '"2021-12-31T02:24:05.477Z"'
const a = {}
a.key = a
JSON.stringify(a)
// Uncaught TypeError: Converting circular structure to JSON
JSON.stringify(12n)
// Uncaught TypeError: Do not know how to serialize a BigInt
const a = {'\u0066': 333}
JSON.stringify(a)
// '{"f":333}'
到此,相信大家对“JSON.parse和JSON.stringify怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是天达云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!