欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JSON基本概念及JSON对象的静态方法讲解

程序员文章站 2022-06-11 11:07:02
json基本概念 javascript object notation——js对象表示法 存储和交换文本信息的语法,属于独立性语言 每个 json 对象就是一个值,值的类型和...

json基本概念

javascript object notation——js对象表示法

存储和交换文本信息的语法,属于独立性语言

每个 json 对象就是一个值,值的类型和格式有严格规定:

复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用nan, infinity, -infinity和undefined)。 字符串必须使用双引号表示,不能使用单引号。 对象的键名必须放在双引号里面。 数组或对象最后一个成员的后面,不能加逗号。

json 对象的静态方法

json.stringify()

基本用法:

// 将一个值转为 json 字符串
// 可以被json.parse方法还原

json.stringify('abc') // ""abc""
json.stringify([1, "false", false])
// '[1,"false",false]'

// 如果对象的属性是undefined、函数或 xml 对象,该属性会被json.stringify过滤。
var obj = {
  a: undefined,
  b: function () {}
};
json.stringify(obj) // "{}"

// 如果数组的成员是undefined、函数或 xml 对象,则这些值被转成null。
var arr = [undefined, function () {}];
json.stringify(arr) // "[null,null]"

// 正则对象会被转成空对象
json.stringify(/foo/) // "{}"

// json.stringify方法会忽略对象的不可遍历属性。
var obj = {};
object.defineproperties(obj, {
  'foo': {
    value: 1,
    enumerable: true
  },
  'bar': {
    value: 2,
    enumerable: false
  }
});

json.stringify(obj); // "{"foo":1}"

第二个参数:

// 第二个参数是数组时,指定需要转成字符串的属性,相当于筛选(白名单)
// 只对对象的属性有效,对数组无效。
var obj = {
  'prop1': 'value1',
  'prop2': 'value2',
  'prop3': 'value3'
};
var selectedproperties = ['prop1', 'prop2'];
json.stringify(obj, selectedproperties) // "{"prop1":"value1","prop2":"value2"}"

// 第二个参数是一个函数时,用来更改json.stringify的返回值。
// 递归处理,第一次键名为空,键值是整个对象
// 如果处理函数返回undefined或没有返回值,则该属性会被忽略。
var o = {a: 1};
function f(key, value) {
  if (typeof value === 'object') {
    return {b: 2};
  }
  return value * 2;
}
json.stringify(o, f)// "{"b": 4}"

第三个参数:

// 用于增加返回的 json 字符串的可读性
// 该参数如果是数字,表示每个属性前面添加的空格(最多不超过10个)
// 如果是字符串(不超过10个字符),则该字符串会添加在每行前面。
json.stringify({ p1: 1, p2: 2 }, null, 2);
/*
"{
  "p1": 1,
  "p2": 2
}"
*/

json.stringify({ p1:1, p2:2 }, null, '|-');
/*
"{
|-"p1": 1,
|-"p2": 2
}"
*/

参数对象的 tojson 方法:

如果参数对象有自定义的tojson方法,那么json.stringify会使用这个方法的返回值作为参数,而忽略原对象的其他属性。

// 小应用:将正则对象自动转为字符串

var obj = {
  reg: /foo/
};
// 不设置 tojson 方法时
json.stringify(obj) // "{"reg":{}}"
// 设置 tojson 方法时
regexp.prototype.tojson = regexp.prototype.tostring;
json.stringify(/foo/) // ""/foo/""

json.parse()

// 解析json 字符串
json.parse('{}') // {}
json.parse('true') // true

// 第二个参数,处理函数
function f(key, value) {
  if (key === 'a') {
    return value + 10;
  }
  return value;
}

json.parse('{"a": 1, "b": 2}', f)
// {a: 11, b: 2}