简单的 JSONParser
最近在学习 Python 的正则表达式内容,我看的是官方的文档,在文档的最后有一个例子,勾起了我的兴趣。它是用正则表达式来制作了一个简单的词法分析器。我觉得这个东西非常有趣,以前在学校的时候,有一次作业我是手写的,不过我感觉写得不好,勉强完成老师的作业吧,哈哈。所以,我参考这个例子写了一个 JSON 的词法分析,然后又加上了简单的语法分析程序。它的整个效果,有点类似于 python 标准库 json 的 json.load()
方法,不过是一个极其简陋的实现,而且基本上没有错误处理。
JSON Tokenizer
JSON 的词法分析,我主要是参考上面这个截图里面的方式,自己写了一个简单的示例。写得比较简单,应该说它只能支持 JSON 的一个简单子集。
这里 TOKEN 的种类,参考了 https://json.org,不过它的 JSON 的语法格式是带 whitespace 的,我不习惯处理这个,所以没有参考它的语法。经过词法分析之后,过滤掉了 空格、换行、制表符,我这里就是简单的丢弃不处理。
json_tokenizer.py
使用正则表达式来进行 JSON 的词法分析。
import json
import refrom typing import Dict, List, Union# TOKEN 的种类
LEFT_BRACE = "LEFT_BRACE" # {RIGHT_BRACE = "RIGHT_BRACE" # }
LEFT_BRACKET = "LEFT_BRACKET" # ]
RIGHT_BRACKET = "RIGHT_BRACKET" # [
COLON = "COLON" # :
COMMA = "COMMA" # ,
NUMBER = "NUMBER" # ".*?"
STRING = "STRING" # [1-9]\d*
BOOL = "BOOL" # true/false
NULL = "NULL" # null
NEWLINE = "NEWLINE" # \n
SKIP = "SKIP" # ' ', '\t'
MISMATCH = "MISMATCH" # mismatch# 处理 token 的正则
token_specification = [('LEFT_BRACE', r'[{]'),('RIGHT_BRACE', r'[}]'),('LEFT_BRACKET', r'[\[]'),('RIGHT_BRACKET', r'[\]]'),('COLON', r'[:]'),('COMMA', r'[,]'),('NUMBER', r'-?[1-9]+[0-9]*'),('STRING', r'".*?"'),('BOOL', r'(true)|(false)'),('NULL', r'null'),('NEWLINE', r'\n'),('SKIP', r'[ \t]'),('MISMATCH', r'.')
]tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
print("Debug: ", tok_regex)def process(kind: str, value: str) -> Dict[str, Union[str, bool, int, None]]:"""处理输入的 kind 和 value,并生成 Dict 对象,简单表示 token 对象"""if kind == STRING:# 去掉外层的双引号,暂时没有比较好的方式return {"kind": kind, "value": value[1:-1]}if kind == NUMBER:return {"kind": kind, "value": int(value)}if kind == BOOL:if value == "true":return {"kind": kind, "value": True}else:return {"kind": kind, "value": False}if kind == NULL:return {"kind": kind, "value": None}return {"kind": kind, "value": value}def tokenizer(json_str: str) -> List[Dict[str, Union[str, bool, int, None]]]:"""tokenizer"""tokens = []for m in re.finditer(tok_regex, json_str):# 获取 token 的类型kind = m.lastgroup# 获取 token 的值value = m.group()if kind == MISMATCH:raise Exception("json format is error")if kind == NEWLINE:continueif kind == SKIP:continuetoken = process(kind=kind, value=value)tokens.append(token)return tokensif __name__ == "__main__":json_doc = open("./demo.json", "r", encoding="utf-8").read()tokens = tokenizer(json_doc)if tokens:json.dump(tokens, open("./json_tokens.json", "w",encoding="utf-8"), ensure_ascii=False)
我这里把输入、输出数据全部放在文档里面了,下面我贴一下我输入数据和部分输出数据。
demo.json
{"name": "小黑子","age": 3,"gender": false,"other_info": {"friends": ["嘎子","潘叔","狗"],"declaration": "练习时长两年半","hobbies": ["唱","跳","rap","篮球
简单的 JSONParser相关推荐
- 简单的JsonParser(Java)
用以测试时写的小工具,以备忘. 代码 in java8 import java.util.ArrayList; import java.util.HashMap; import java.util.M ...
- 自己动手实现一个简单的JSON解析器
1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...
- Android简单实现将手机图片上传到服务器中
在本例中,将会简单的实现安卓手机将图片上传到服务器中,本例使用到了 服务器端:PHP+APACHE 客户端:JAVA 先简单实现一下服务器端的上传并测试上传效果,看实例 <?php if(emp ...
- json string 格式_自己动手实现一个简单的JSON解析器
作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...
- 【转】基于WebSocketSharp 的IM 简单实现
websocket-sharp 是一个websocket的C#实现,支持.net 3.5及以上来开发服务端或者客户端.本文主要介绍用websocket-sharp来做服务端.JavaScript做客户 ...
- java中的mapper是什么_Java使用ObjectMapper的简单示例
一.什么是ObjectMapper? ObjectMapper类是Jackson库的主要类,它提供一些功能将数据集或对象转换的实现. 它将使用JsonParser和JsonGenerator实例来实现 ...
- 基于WebSocketSharp 的IM 简单实现
websocket-sharp 是一个websocket的C#实现,支持.net 3.5及以上来开发服务端或者客户端.本文主要介绍用websocket-sharp来做服务端.JavaScript做客户 ...
- Go 使用 buger/jsonparser 优化反序列化性能
前言 最近在做一个工具,从 日志系统 ES 集群导出数据,压缩然后上传到腾讯云存储,作为离线冷备份数据.在此过程中,遇到了数个性能问题. 其中 Elasticsearch SDK 的反序列化性能成为了 ...
- node.js + express + mysql 简单运用
主要是学习下如何简单得运用,自己可以写出一个后台 目录 初始化一个项目 创建web服务 get请求 post put delete 三个请求 引入ejs 模板 中间件 cookie session 路 ...
最新文章
- Jedis无法远程连接阿里云服务器的redis问题
- linux u盘 挂载 type,Linux挂载U盘报错:mount: unknown filesystem type 'ntfs'
- 朝聚眼科完成4亿元B轮融资,兰馨亚洲和阳光融汇投资...
- 全网首译 : 初学者终极指南—掌握Scrum敏捷框架—第1章
- python学习之老男孩python全栈第九期_day004知识点总结
- tomcat 7 下添加 shared/lib 文件夹
- c语言程序设计教程 实验十,清华大学出版社-图书详情-《C语言程序设计实验教程》...
- python的concat用法_python的concat等多种用法详解
- C# DateTime简单的定时器用法
- 通过网络地址进行真机调试
- First of all, let’s talk about the richest man in Japan
- 腾讯云区块链产品负责人邵兵:产业区块链刚刚起步,做好基础设施才有可能进入2.0阶段
- python模块 包 文件_Python临时文件模块
- Mac上Jupyter之notebook快捷键
- csgo躲猫猫模式显示服务器已满,csgo躲猫猫攻略大全
- pythonATM,购物车项目实战_补充3——core模块
- 1114 Family Property (25 分)
- ESP8266固件SDK开发初体验-让ESP8266打印helloworld(基于安信可ESP-07)
- Excel字符函数(3):字符查找函数Find、Search
- 翻过这道山,就有人听到你的故事。
热门文章