手写实现 JSON.parse

发布于 2023-05-04 12:29:31 字数 2277 浏览 84 评论 0

eval 实现

需要在左右添加括号,才能获得值。否则语法报错

const a = eval("(" + JSON.stringify({a:1})+")")

手写

function myParse(jsonStr) {
    let index = 0

    function parseValue() {
        let ch = jsonStr[index]
        const strategies = {
            '{': parseObject,
            '[': parseArr,
            't': parseTrue,
            'f': parseFalse,
            'n': parseNull,
            '"': parseString,
        }
        console.log('---', ch)
        const fn = strategies[ch]
        return fn ? fn() : parseNumber()
    }

    function parseObject() {
        let obj = {}
        index++
        while (jsonStr[index] !== '}') {
            let key = parseString()
            index++
            let value = parseValue()

            obj[key] = value

            if (jsonStr[index] === ',') {
                index++
            }
        }
        index++
        return obj
    }




    function parseArr() {
        let arr = []
        index++
        while (jsonStr[index] !== ']') {
            let value = parseValue()
            arr.push(value)

            if (jsonStr[index] === ',') {
                index++
            }
        }
        index++
        return arr
    }

    function parseString() {
        // "asdf"
        let str = ''
        index++
        while (jsonStr[index] !== '"') {
            str += jsonStr[index]
            index++
        }
        index++
        return str
    }


    function parseNull() {
        index += 'null'.length
        return null
    }

    function parseTrue() {
        index += 'true'.length
        return true
    }

    function parseFalse() {
        index += 'false'.length
        return false
    }

    function parseNumber() {
        let numStr = ''
        let ch = jsonStr[index]
        while (isDigit(ch) || ch === '.' || ch === "e" || ch === 'E' || ch === '+' || ch === '-') {
            numStr += ch
            index++
            ch = jsonStr[index]
        }
        return parseFloat(numStr)
    }

    function isDigit(ch) {
        return ch >= '0' && ch <= '9'
    }

    return parseValue()
}


myParse(JSON.stringify({
    foo: 'bar',
    test: [1, 2, {}],
    c: true,
    d: false,
    e: null,
    f: 1234
}))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

绮烟

暂无简介

0 文章
0 评论
25 人气
更多

推荐作者

wanghao

文章 0 评论 0

蓝天

文章 0 评论 0

handsomedeng

文章 0 评论 0

仙女

文章 0 评论 0

石海龙

文章 0 评论 0

dianjvnan

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文