在Javascript中,JSON.parse()是用来将JSON格式的字符串转换为Javascript对象的函数.它非常常用,特别是在处理从API返回的JSON数据时。以下是JSON.parse()的实现和一些注意事项
# 基本表用法
const jsonString = '{"name": "John", "age": 30, "city": "New York"}';
// 将JSON字符串转换为对象
const jsonObject = JSON.parse(jsonString);
console.log(jsonObject);
// 输出: { name: 'John', age: 30, city: 'New York' }
# 带有 reviver 参数的用法
JSON.parse()的第二个参数是一个 reviver 函数,它允许你对每个键值对进行转换处理
const jsonString = '{"name": "John", "age": 30, "city": "New York"}';
// 使用 reviver 参数,将age的值增加1
const jsonObject = JSON.parse(jsonString, (key, value) => {
if(key === 'age') {
return value + 1;
}
return value;
});
console.log(jsonObject);
// 输出: { name: 'John', age: 31, city: 'New York' }
# 处理无效JSON
JSON.parse()只能解析有效的JSON格式。如果字符串格式不正确,会抛出错误。因此,你可以使用try...catch进行错误处理
const invalidJson = '{"name": "John", "age": 30,' // 不完整json字符串
try {
const jsonObject = JSON.parse(invalidJson);
console.log(jsonObject);
} catch(e) {
console.log('解析 JSON 出错:', error.message);
}
# 简单版实现JSON.parse()
我们可以实现一个非常基础的 JSON.parse(),支持最基本的数据类型如数字、字符串、布尔值和简单的对象。这个实现不处理所有JSON规范中的边缘情况,如嵌套、转义字符等
function basicJSONParse(jsonString) {
// 去掉前后的空白字符
jsonString = jsonString.trim();
// 判断是否是对象
if (jsonString.startsWith('{') && jsonString.endsWith('}')) {
let obj = {};
// 去掉花括号
jsonString = jsonString.slice(1, -1);
// 将对象内的键值对按逗号分割
let pairs = jsonString.split(',');
pairs.forEach(pair => {
let [key, value] = pair.split(':');
key = key.trim().replace(/['"]+/g, ''); // 去掉引号
value = value.trim();
// 处理数字、布尔值和字符串
if (value.startsWith('"') && value.endsWith('"')) {
value = value.slice(1, -1); // 字符串
} else if (value === 'true') {
value = true; // 布尔值 true
} else if (value === 'false') {
value = false; // 布尔值 false
} else if (!isNaN(value)) {
value = Number(value); // 数字
}
obj[key] = value;
});
return obj;
}
// 如果输入的不是对象,直接抛错
throw new Error("Unsupported JSON format");
}
// 示例
const jsonString = '{"name": "John", "age": 30, "isStudent": false}';
const result = basicJSONParse(jsonString);
console.log(result); // { name: 'John', age: 30, isStudent: false }