Parse: Python实现JSON-decode解析器

本文介绍了JSON数据格式的特点,以及如何用Python编写一个简单的JSON解析器,包括token类型定义和处理过程,展示了如何将JSON字符串转化为Python可读的数据结构。
摘要由CSDN通过智能技术生成

JSON是一种编程语言无关的数据格式,它是一种轻量级的数据交换格式。JSON的数据格式在语法上与Python的字典类似,但是JSON的数据格式是纯文本的,它可以被任何编程语言读取和解析。

JSON的数据格式是一个键值对的集合,它由键值对组成,键值对之间使用逗号分隔,键值对的键和值之间使用冒号分隔。JSON的数据格式可以包含数组和对象,数组是一个有序的值的集合,对象是一个无序的键值对的集合。

其数据结构可以在官方文档中查看:https://www.json.org/json-zh.html

接下来我们用Python实现一个JSON解析器,实现JSON的解析。

JSON解析器

token 类型

token_eof = 0
token_number = 1
token_string = 2
token_bool = 3
token_array = 4
token_object = 5
token_null = 6
token_colon = 7
token_comma = 8     # ,
token_lbrace = 9    # {
token_rbrace = 10   # }
token_lbracket = 11 # [
token_rbracket = 12 # ]

映射token类型到字符串

def token_name(tok):
    return {
        token_eof: 'eof',
        token_number: 'number',
        token_string: 'string',
        token_bool: 'bool',
        token_array: 'array',
        token_object: 'object',
        token_colon: 'colon',
        token_comma: 'comma',
        token_lbrace: 'lbrace',
        token_rbrace: 'rbrace',
        token_lbracket: 'lbracket',
        token_rbracket: 'rbracket',
        token_null: 'null',
    }[tok]

tokenify函数,将单词后者数字、符号转换为token流

def tokenify(s):
    l = len(s)
    cursor = 0
    while cursor < l:
        c = s[cursor]
        if c.isspace():
            cursor += 1
        elif c.isdigit():
            num, cursor = parse_number(s, l, cursor)
            yield token_number, num
        elif c == '-':
            cursor += 1
            num, cursor = parse_number(s, l, cursor)
            yield token_number, -num
        elif c == '"':
            str, cursor = parse_string(s, l, cursor)
            yield token_string, str
        elif c == 't':
            val, cursor = parse_true(s, l, cursor)
            yield token_bool, val
        elif c == 'f':
            val, cursor = parse_false(s, l, cursor)
            yield token_bool, val
        elif c == 'n':
            val, cursor = parse_null(s, l, cursor)
            yield token_null, val
        elif c == '[':
            cursor += 1
            yield token_lbracket, c
        elif c == ']':
            cursor += 1
            yield token_rbracket, c
        elif c == '{':
            cursor += 1
            yield token_lbrace, c
        elif c == '}':
            cursor += 1
            yield token_rbrace, c
        elif c == ':':
            cursor += 1
            yield token_colon, c
        elif c == ',':
            cursor += 1
            yield token_comma, c
        else:
            raise ValueError('unexpected character: ' + c)

解析数字,包含整数和小数

def parse_number(s, l, cursor):
    num = 0
    while cursor < l and s[cursor].isdigit():
        num = num * 10 + int(s[cursor])
        cursor += 1
    if cursor < l and s[cursor] == '.':
        cursor += 1
        div = 1
        while cursor < l and s[cursor].isdigit():
            num = num * 10 + int(s[cursor])
            div *= 10
            cursor += 1
        return num / div, cursor
    return num, cursor

解析字符串

def parse_string(s, l, cursor):
    cursor += 1
    start = cursor
    while cursor < l:
        if s[cursor-1] != '\\' and s[cursor] == '"':
            break
        cursor += 1
    return s[start:cursor], cursor + 1

解析true

def parse_true(s, l, cursor):
    if len(s) < cursor + 4:
        raise ValueError('unexpected character: ' + c)
    elif s[cursor:cursor+4] != 'true':
        raise ValueError('unexpected character: ' + c)
    cursor += 4
    return True, cursor

解析false

def parse_false(s, l, cursor):
    if len(s) < cursor + 5:
        raise ValueError('unexpected character: ' + c)
    elif s[cursor:cursor+5] != 'false':
        raise ValueError('unexpected character: ' + c)
    cursor += 5
    return False, cursor

解析null

def parse_null(s, l, cursor):
    if len(s) < cursor + 4:
        raise ValueError('unexpected character: ' + c)
    elif s[cursor:cursor+4] != 'null':
        raise ValueError('unexpected character: ' + c)
    cursor += 4
    return None, cursor

解析JSON,将token流转换为JSON对象

完整内容见:

以上就是“Parse: Python实现JSON-decode解析器”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值