Zyyo

Just for fun

文章

24

标签

25

评论

18492

数据统计

成立

430天

文章

24篇

评论

18492条

标签

25个

最近文章

使用javscript手写json-parse

空虚使我寂寞难耐索性开整
一个非常简单的JsonParse
花了我一下午加一晚上的心思
目前已经支持对象,数组互相嵌套,数字,字符串 布尔

还未实现

严格的错误校验,本项目是根据一个标准的Json格式来实现的,没有进行格式判断,你如果拿出来一个未经严格校验的json字符串来解析,甚至有可能得到正确的结果
不支持更多数字类型
不支持特殊字符转义
不支持顶层数组(我写完才发现有这个特性)。。。

作者zyyo
项目地址
https://github.com/ZYYO666/fuckDemo
(这个项目专门放各种demo)




function Json(string, _index = 0) {
    let index = _index
    let json = string.trim()
    let jsonparse = json.split('')
    let prevAttr = ''
    let isArray = false
    let isFirst = true
    const result = {}



    //通用的处理,调用其他处理器
    function parse() {
        skip()
        if (jsonparse[index] == '{') {
            return parseDakuohao1()
        } else if (jsonparse[index] == ':') {
            return parseMaohao()
        } else if (jsonparse[index] == '"') {
            return parseString()
        } else if (jsonparse[index] == ',') {
            return parseDouhao()
        } else if (/\d/.test(jsonparse[index]) || jsonparse[index] == '-') {
            return parseNum()
        } else if (json.slice(index, index + 4) === 'true') {
            return parseTrue()
        } else if (json.slice(index, index + 5) === 'false') {
            return parseFalse()
        } else if (json.slice(index, index + 4) === 'null') {
            return parseNull()
        } else if (jsonparse[index] == '}') {
            return parseDakuohao2()
        } else if (jsonparse[index] == '[') {
            return parseArray1()
        } else if (jsonparse[index] == ']') {
            return parseArray2()
        } else if (index == jsonparse.length) {
            throw new Error('标签未闭合')
        } else {
            console.log(result);
            throw new Error('未知字符' + jsonparse[index])
        }
    }
    function skip() {
        while (jsonparse[index] == ' ' || jsonparse[index] == '\n') {
            index++
        }
    }
    function parseMaohao() {
        index++
        return parse()
    }
    function parseArray1() {
        index++
        if (prevAttr == '') {
            throw new Error('[]不能用作属性')
        }
        result[prevAttr] = []
        isArray = true
        return parse()
    }
    function parseArray2() {
        index++
        prevAttr = ''
        isArray = false
        return parse()
    }
    function parseTrue() {
        index += 4
        if (prevAttr == '') {
            throw new Error('True不能用作属性')
        }
        if (isArray) {
            result[prevAttr].push(true)
        } else {
            result[prevAttr] = true
            prevAttr = ''
        }
        return parse()
    }
    function parseFalse() {
        index += 5
        if (prevAttr == '') {
            throw new Error('False不能用作属性')
        }
        if (isArray) {
            result[prevAttr].push(false)
        } else {
            result[prevAttr] = false
            prevAttr = ''
        }
        return parse()
    }
    function parseNull() {
        index += 4
        if (prevAttr == '') {
            throw new Error('null不能用作属性')
        }
        if (isArray) {
            result[prevAttr].push(null)
        } else {
            result[prevAttr] = null
            prevAttr = ''
        }
        return parse()
    }
    function parseNum() {

        let num = ''
        while (jsonparse[index] !== '}' && jsonparse[index] !== ',' && jsonparse[index] !== ']') {
            num += jsonparse[index]
            index++
        }
        if (typeof num !== 'number' && isNaN(num)) {
            throw new Error('数字格式错误')
        }
        if (prevAttr == '') {
            throw new Error('json格式错误')
        }
        num = Number(num)
        if (isArray) {
            result[prevAttr].push(num)
        } else {
            result[prevAttr] = num
            prevAttr = ''
        }
        return parse()

    }

    function parseDakuohao1() {
        if (isFirst == true) {
            index++
            isFirst = false

        } else {
            const res = Json(json, index)
            index = res.index

            if (prevAttr == '') {
                throw new Error('错误')
            }
            if (isArray) {
                result[prevAttr].push(res.object)
            } else {
                result[prevAttr] = res.object
                prevAttr = ''
            }
        }
        return parse()
    }
    function parseDakuohao2() {
        return {
            object: result,
            index: ++index
        }
    }
    function parseDouhao() {
        index++
        return parse()
    }
    function parseString() {
        let str = ''
        index++ //第一个双引号
        while (jsonparse[index] !== '"') {
            str += jsonparse[index]
            index++
        }
        index++ //第二个双引号

        if (prevAttr == '') {
            prevAttr = str
            result[str] = undefined;
            return parse()
        }

        if (isArray) {
            result[prevAttr].push(str)
        } else {
            result[prevAttr] = str

            prevAttr = ''
        }
        return parse()
    }
    return parse()


}

const json1 = {
    id: [1, {
        a: 1,
        b: {
            a: 1,
            b: 2
        }

    }, "zyyo", 3, 4, 5],
    name: "Example Object",
    isActive: true,
    details: {
        description: "This is a complex object for testing purposes.",
        metadata: {
            version: -2.5,
            createdBy: "admin",
            isVerified: false,
            history: {
                firstCreated: "2023-01-01",
                lastUpdated: "2023-10-01",
                updates: {
                    total: 5,
                    recent: {
                        date: "2023-09-15",
                        changes: {
                            added: 3,
                            removed: 1,
                            modified: 2
                        }
                    }
                }
            }
        }
    },
    settings: {
        preferences: {
            theme: "dark",
            notifications: {
                email: true,
                sms: false,
                push: true
            }
        },
        limits: {
            maxConnections: 10,
            timeout: 30000
        }
    },
    tags: {
        category: "test",
        priority: "high",
        attributes: {
            security: "confidential",
            scope: "internal"
        }
    }
};

const testjson = JSON.stringify(json1);



try {
    console.time("json")
    for (let i = 0; i < 10000; i++) {
       Json(testjson).object;
    }
    console.timeEnd("json")
    console.time("jsonpaser")
    for (let i = 0; i < 10000; i++) {
         JSON.parse(testjson)
    }
    console.timeEnd("jsonpaser")
} catch (error) {
    console.log(error.message)
}

使用javscript手写json-parse

发布于

April 2, 2025

分类

实用分享

版权协议

MIT

评论
正在回复评论:ab-resurs 的评论 取消
😀
已有 270 条评论
    Jamespab 2026-01-15 回复

    Выгодный селлер купить БМ Фейсбук предоставляет доступ купить профили для бизнеса. Когда вы планируете купить аккаунты Facebook, обычно задача не в «одном логине», а в трасте и лимитах: стабильный запуск, наличие пройденного ЗРД в Ads Manager и правильно созданные ФП. Мы оформили понятную навигацию, чтобы вы без лишних вопросов понимали какой лимит выбрать перед покупкой.Коротко: с чего начать: откройте разделы Фарм (King), а для масштабирования — идите сразу в профильные позиции: BM 250$. Важно: покупка — это только вход. Дальше решает подход к запуску: как вяжется карта, как вы передаете лички без триггеров, как проходите чеки и как масштабируете адсеты. Ключевое преимущество данной площадки — заключается в наличие эксклюзивной базы знаний по FB, где собраны свежие инструкции по разбану кабинетов. Команда поможем, каким образом аккуратно запустить первый адсет, чтобы не словили Risk Payment и продлили жизнь аккаунтам . Заходите в сообщество, смотрите полезные материалы по FB, наводите порядок и повышайте ROI вместе с нами без задержек. Дисклеймер: используйте активы законно и с учетом правил Meta.
    Популярный шоп купить валидные аккаунты FB дает доступ подобрать аккаунты для бизнеса. Если вам нужно купить Facebook-аккаунты, обычно задача не в «просто доступе», а в качестве фарма: уверенный спенд, зеленые плашки в кабинете и правильно созданные ФП. Мы оформили практичный чек-лист, чтобы вы без лишних вопросов понимали какой тип аккаунта брать до оплаты.Что внутри: типы аккаунтов (Мамки, Автореги, Логи). Важно: покупка — это только вход. Дальше решает подход к запуску: какой прокси используется, как вы передаете лички без триггеров, как реагируете на полиси и как дублируете кампании. Главная фишка этого шопа — это наличии масштабной вики-энциклопедии FB, где опубликованы актуальные гайды по работе с БМами. Здесь можно найти аккаунты Meta под любые цели: начиная с дешевых авторегов до трастовыми БМами с высоким лимитом. Переходите в сообщество, смотрите полезные материалы по FB, упрощайте работу с Meta и в итоге повышайте ROI на базе наших расходников без задержек. Дисклеймер: действуйте в рамках закона и всегда в соответствии с правилами Facebook.
    Популярный селлер перейти на сайт предлагает доступ приобрести профили под рекламу. Когда вы планируете купить аккаунты Facebook, обычно задача не в «просто доступе», а в качестве фарма: стабильный запуск, зеленые плашки в Ads Manager и прогретые FanPage. Мы оформили понятную навигацию, чтобы вы сразу понимали что подойдет под ваши офферы перед заказом.Быстрый ориентир: откройте категории Фарм (King), а для масштабирования — идите сразу в разделы под залив: BM 250$. Ключевая идея: покупка — это только вход. Дальше решает схема залива: какой прокси используется, как вы передаете лички аккуратно, как реагируете на полиси и как дублируете кампании. Особенность данной площадки — это наличие эксклюзивной образовательной секции, в которой выложены практичные рекомендации по запуску рекламы. На сайте можно найти акки FB для разных сетапов: от миксов и заканчивая мощными Кингами с высоким лимитом. Вступайте в наше комьюнити, читайте практичные кейсы по заливу, упрощайте работу с Meta и улучшайте конверт на базе наших расходников уже сегодня. Важно: используйте активы законно и всегда с учетом правил Meta.
    Трастовый поставщик https://accounts-marketplace2000.com встречает маркетологов в нашем ассортименте цифровых товаров. Если вам нужно купить Facebook-аккаунты, обычно задача не в «одном логине», а в управляемости: предсказуемая операционка, разделение задач между участниками и ясные доступы. Мы собрали практичный чек-лист, чтобы вы сразу понимали куда кликать до оплаты.Что внутри: FAQ. Важно: покупка — это только вход. Дальше решает порядок: как выдаются права, как вы ведете кампании последовательно, как фиксируете изменения и как разделяете тестовые и стабильные процессы. Особенность нашего сервиса — заключается в наличии огромной образовательной секции, где выложены актуальные чек-листы по работе с доступами. Мы поможем, как без лишних рисков выстроить процесс, чтобы вы старт был предсказуемым а также соблюдались правила . Оформляя здесь, клиент получает не просто состав, а также оперативную консультацию, понятные условия, гарантию на вход плюс самые адекватные прайсы на рынке. Дисклеймер: используйте активы законно и в соответствии с правилами платформ.
    Качественный сайт купить валидные аккаунты FB приветствует всех в нашем пространстве цифровых товаров для FB. Если вам нужно купить аккаунты Facebook, чаще всего важен не «просто доступе», а в проходимости чеков: отсутствие вылетов на селфи, наличие пройденного ЗРД в Ads Manager и прогретые FanPage. Мы подготовили понятную навигацию, чтобы вы сразу понимали какой тип аккаунта брать до оплаты.Коротко: с чего начать: начните с категории Фарм (King), а для серьезных объемов — переходите сразу в профильные позиции: Безлимитные БМ. Важно: аккаунт — это инструмент. Дальше решает подход к запуску: как вяжется карта, как шерите пиксели без триггеров, как проходите чеки и как масштабируете адсеты. Главная фишка нашего сервиса — заключается в наличии эксклюзивной библиотеки арбитражника, в которой написаны свежие инструкции по разбану кабинетов. Команда поможем, как аккуратно привязать карту, чтобы не улетели на полиси а также дольше жили в аукционе . Оформляя у нас, вы получаете не только валидный профиль, а также оперативную поддержку, понятные условия замены, страховку на валид плюс самые низкие цены на рынке FB-аккаунтов. Важно: действуйте в рамках закона и всегда в соответствии с правилами Facebook.

    uakino-382 2026-01-11 回复

    дивитися серіали онлайн онлайн трансляція фільмів uakino.lu

    faamru 2026-01-11 回复

    Продажа тяговых АКБ https://faamru.com для складской техники любого типа: вилочные погрузчики, ричтраки, электрические тележки и штабелеры. Качественные аккумуляторные батареи, долгий срок службы, гарантия и профессиональный подбор.

    faamru 2026-01-11 回复

    Продажа тяговых АКБ https://faamru.com для складской техники любого типа: вилочные погрузчики, ричтраки, электрические тележки и штабелеры. Качественные аккумуляторные батареи, долгий срок службы, гарантия и профессиональный подбор.

    ab-resurs 2026-01-11 回复

    Тяговые аккумуляторные https://ab-resurs.ru батареи для складской техники: погрузчики, ричтраки, электротележки, штабелеры. Новые АКБ с гарантией, помощь в подборе, совместимость с популярными моделями, доставка и сервисное сопровождение.

    Ramonjum 2026-01-11 回复

    Продвижение сайтов https://team-black-top.ru под ключ: аудит, стратегия, семантика, техоптимизация, контент и ссылки. Улучшаем позиции в Google/Яндекс, увеличиваем трафик и заявки. Прозрачная отчетность, понятные KPI и работа на результат — от старта до стабильного роста.

    ua-bay-2 2026-01-09 回复

    кіно онлайн фентезі та пригоди онлайн українською

    avigroup 2025-12-31 回复

    Нужен трафик и лиды? https://avigroup.pro/kazan/ SEO-оптимизация, продвижение сайтов и реклама в Яндекс Директ: приводим целевой трафик и заявки. Аудит, семантика, контент, техническое SEO, настройка и ведение рекламы. Работаем на результат — рост лидов, продаж и позиций.

感谢支持!

微信二维码

请使用微信扫描二维码打赏。

支付宝二维码

请使用支付宝扫描二维码打赏。