JSON常见用法

117 阅读5分钟

一、JSON 结构和语法

JSON 易于编写和阅读,并且易于在大多数语言使用的数据结构之间进行转换。下面看一下 JSON 对象的组成、JSON 支持的数据类型以及这种数据格式语法的其他细节。

1. 结构

下面是一个最基本的示例:

{"name": "kobe"}

在上面的示例中,key是 name,值是 kobe。JSON 可以保存多个 key:value对:

{"name": "kobe", "age": 40, "number": 24}

当然这只是一个简单的例子,在实际应用中JSON会存在多层嵌套。对象和数组是可以保存其他值的值,因此 JSON 数据可能会发生无限嵌套。这允许 JSON 描述大多数数据类型。

下面是 JSON 数据类型的完整列表:

  • string:用引号括起来的文字。
  • number:正整数或负整数或浮点数。
  • object:用花括号括起来的键值对
  • array:一个或多个 JSON 对象的集合。
  • boolean:不带引号的 true 或 false 值。
  • null:表示键值对没有数据,表示为null,不带引号。

下面是一个包含所有这些数据类型的 JSON 对象示例:

{
  "name": "kobe",
  "age": 41,
  "number": 24,
  "greatPlayer":true,
  "children": [{
    "name": "Natalia",
    "age": 19,
    "number": 2
  }, {
    "name": "Gianna",
    "age": 13,
  }, {
    "name": "Bianka",
    "age": 6,
  }, {
    "name": "Capri",
    "age": 3,
  }],
  "job": ["basketballPlayer", "JavaScript"],
  "soubriquet": "Black Mamba"
  "wife": "Vanessa",
  "wages": null,
}

二、JSON 解析与序列化

JSON 提供了两种方法:

  • JSON.parse() :将数据转换为 JavaScript 对象。
  • JSON.stringify() :将 JavaScript 对象转换为字符串。

1. JSON.parse()

JSON.parse() 的语法如下:

JSON.parse(text, reviver)
  • text: 必需, 一个有效的 JSON 字符串。
  • reviver:可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
const json = '{"name": "kobe", "age": 41, "number": 24}';

const myJSON = JSON.parse(json);
 
console.log(myJSON.name, myJSON.age);  // kobe 41

我们可以启用 JSON.parse 的第二个参数 reviver,一个转换结果的函数,对象的每个成员调用此函数:

const json = '{"name": "kobe", "age": 41, "number": 24}';

const myJSON = JSON.parse(json, (key, value) => {
  if(typeof value === "number") {
     return String(value).padStart(5, "0"); // padStart是一共几位,然后空余补位
  }
  return value;
});
 
console.log(myJSON.name, myJSON.age);  // kobe 00041

2. JSON.stringify()

JSON.stringify() 的语法如下:

JSON.stringify(value, replacer, space)
  • value: 必需, 要转换的 JavaScript 值(通常为对象或数组)。
  • replacer: 可选。用于转换结果的函数或数组。如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
  • space: 可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。 此处可以用在生成json文件:JSON.stringify(json, null, 2)

实用技巧

下面来看看JSON有哪些实用技巧。

1. 格式化JSON

上面我们说了可以JSON.stringify()来将JSON对象转换为字符串。它支持第二个和第三个参数。我们可以借助第二三参数来格式化JSON字符串。支持情况下,格式化后的字符串长这样:

const json = {"name": "kobe", "age": 41, "number": 24};

const myJSON = JSON.stringify(json);
 
console.log(myJSON);  // {"name": "kobe", "age": 41, "number": 24}

添加第二三个参数:

const json = {"name": "kobe", "age": 41, "number": 24};

const myJSON = JSON.stringify(json, null, 2);
 
console.log(myJSON);  

生成的字符串格式如下:

{
  "name": "kobe",
  "age": 41,
  "number": 24
}

这里的 2 其实就是为返回值文本在每个级别缩进 2 个空格。

如果缩进是一个字符串而不是空格,就可以传入需要缩进的填充字符串:(不过可能一般用的比较少)

const json = {"name": "kobe", "age": 41, "number": 24};

const myJSON = JSON.stringify(json, null, "--");
 
console.log(myJSON);  

输出结果如下:

{
--"name": "kobe",
--"age": 41,
--"number": 24
}
2. 隐藏某些属性(此用法其实和直接用delete没什么区别)

我们知道JSON.stringify()支持第二个参数,用来处理JSON中的数据:

const user = {
  "name": "kobe",
  "age": 41,
  "number": 24
}

console.log(JSON.stringify(user, (key, value) => {
    if (key === 'age') return
    return value
}));

// 输出结果:{"name":"kobe","number":24}

可以将第二个参数抽离出一个函数:

const user = {
  "name": "kobe",
  "age": 41,
  "number": 24
}

console.log(JSON.stringify(user, filterKeys('name', 'number')))
function filterKeys(...keys) {
    return (key, value) => {
        if (keys.includes(key)) {
           return;
        }
        else return value;
    };
}

// 输出结果:{"age":41}
3. 过滤结果(很好用,无需任何函数)

当JSON中的内容很多是,想要查看指定字段是比较难的。我们可以借助JSON.stringify()的第二个属性来获取指定值,只需传入指定一个包含要查看的属性 key 的数组即可:

const user = {
  "name": "kobe",
  "age": 41,
  "number": 24
}

console.log(JSON.stringify(user, ['name', 'number']))

// 输出结果:{"name":"kobe","number":24}

3. 异常处理

那如果JSON无效怎么办呢?比如缺少了逗号,引号等,上面的两种方法都会抛出异常。建议在使用这两个方法时使用try...catch来包裹,也可以将其封装成一个函数。

let myJSON = {}
const json = '{"name": "kobe", "age": 41, "number": 24}';

try {
  myJSON = JSON.parse(json);
} catch (e){
  console.error(e.message)
}
console.log(myJSON.name, myJSON.age);  // kobe 41

如果 JSON 操作时出现问题,这将确保应用程序不会因此中断。

4. 其他操作

① 删除键值对

可以使用 delete 运算符来删除键值对:

const json = {"name": "kobe", "age": 41, "number": 24};

delete json.age;
 
console.log(json);  // {name: 'kobe', number: 24}

② 访问数组项

可以使用方括号[]和索引从 JSON 中访问数组项:

const json = {
  "name": "kobe",
  "age": 41,
  "greatPlayer":true,
  "children": [{
    "name": "Natalia",
    "age": 19,
    "number": 2
  }, {
    "name": "Gianna",
    "age": 13,
  }, {
    "name": "Bianka",
    "age": 6,
  }, {
    "name": "Capri",
    "age": 3,
  }],
  "number": ["8", "24"],
  "soubriquet": "Black Mamba"
  "wife": "Vanessa",
  "wages": null,
};

console.log(json.number[0]); // 8

③ 遍历数组项

可以使用for循环来遍历JSON中的数组项:

const json = {
  "name": "kobe",
  "age": 18,
  "number": ["8", "24"],
};

for (item of json.number) {
    console.log(item);  // 8 24
}