面试常考点:手写一个JSON.stringify和JSON.parse

本文介绍了JSON.stringify方法,用于将JavaScript对象转换为JSON字符串,以及一个简化版的模拟实现。同时提到了JSON.parse作为反向操作,将JSON字符串解析回JavaScript对象,使用eval进行简单实现。文章未涉及复杂情况如函数类型的处理。

JSON.stringify:是一个JSON的内置方法,用来将数据转成JSON字符串的api

测试一下JSON.stringify本身的数据转换情况,如下:

话不多说直接贴手写模拟实现的代码: 

const jsonStringify = (obj) => {
        if (Object.is(obj, NaN)) {
            return 'null';
        }
        if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null) {
            return String(obj);
        }
        if (typeof obj === 'string') {
            return '"' + obj.replace(/"/g, '\\"') + '"';
        }
        if (Array.isArray(obj)) {
            return "[" + obj.map((item) => jsonStringify(item)).join(",") + "]";
        }
        // 暂时只考虑对象类型,什么RegExp,函数类型暂时不考虑处理
        if (typeof obj === 'object') {
            const pairs = [];
            for (let key in obj) {
                if (Object.hasOwnProperty.call(obj, key) && obj[key] !== undefined) {
                    pairs.push('"' + key + '":' + jsonStringify(obj[key]));
                }
            }
            return "{" + pairs.join(",") + "}";
        }
    };

稍微解释一下,引用类型需要考虑递归处理,这里暂时不考虑太过复杂的情况,比如函数之类的 

JSON.parse()将一个JSON字符串转换回JavaScript对象或数组的方法 

 JSON.parse的实现就不细说了,就一行代码的事情,用eval去执行

    const jsonParse=(str)=>{
        return eval('('+str+')')
    }

// 加载树形数据 const load = async () => { try { const res = await request.get<ResponseStructure>('/category/tree') console.log('完整响应结构:', res) if (res.status !== 200) { // 增加HTTP状态码检查 throw new Error(`HTTP错误 ${res.status}`) } if (!res.data?.data) { throw new Error('缺少data字段') } if (res.data.code === "200") { const formatTreeData = (data: CategoryEntity[]): CategoryEntity[] => { return data.map(item => ({ id: Number(item.id), title: String(item.title), parentId: item.parentId !== null ? Number(item.parentId) : null, sort: Number(item.sort), children: item.children && Array.isArray(item.children) ? formatTreeData(item.children) : [] })) } tableData.value = formatTreeData(res.data.data || []) console.log('格式化后的数据:', JSON.parse(JSON.stringify(tableData.value))) // 深度日志 } else { ElMessage.error(`业务错误: ${res.data.msg || '未知错误'}`) } } catch (error: any) { ElMessage.error(`加载失败: ${error.message}`) console.error('错误详情:', error) } } // 初始化加载 onMounted(() => { load() })而已经知道import axios from "axios"; import { ElMessage } from "element-plus"; const request=axios.create({ //跟有毛病似的,非要我从浏览器里面复制地址给你,手写的都不行,真是服了 baseURL:'http://localhost:8080', timeout:30000 }) //request拦截器,可以自请求发送前对请求做一些处理 request.interceptors.request.use(config =>{ config.headers['Content-Type']='application/json;charset=utf-8'; let user= JSON.parse(localStorage.getItem('xm-pro-user')||'{}')//跟自己的文件名一致 config.headers['token']=user.token return config },error=>{ return Promise.reject(error) }); request.interceptors.response.use( response=>{ let res=response.data; if(typeof res==='string'){ res=res?JSON.parse(res):res } if(res.code==='401'){ ElMessage.error(res.msg) setTimeout(() => { location.href = '/login' }, 500) }else{ return res; } }, error=>{ if(error.response.status===404){ ElMessage.error('未找到请求接口') }else if(error.response.status===500){ ElMessage.error('系统异,请查看后端控制台报错') }else{ console.error(error.message) } return Promise.reject(error) } ) export default request为什么会出现 Error: HTTP错误 undefined,给出修改的完整代码
03-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值