最近在学习 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相关推荐

  1. 简单的JsonParser(Java)

    用以测试时写的小工具,以备忘. 代码 in java8 import java.util.ArrayList; import java.util.HashMap; import java.util.M ...

  2. 自己动手实现一个简单的JSON解析器

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...

  3. Android简单实现将手机图片上传到服务器中

    在本例中,将会简单的实现安卓手机将图片上传到服务器中,本例使用到了 服务器端:PHP+APACHE 客户端:JAVA 先简单实现一下服务器端的上传并测试上传效果,看实例 <?php if(emp ...

  4. json string 格式_自己动手实现一个简单的JSON解析器

    作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  5. 【转】基于WebSocketSharp 的IM 简单实现

    websocket-sharp 是一个websocket的C#实现,支持.net 3.5及以上来开发服务端或者客户端.本文主要介绍用websocket-sharp来做服务端.JavaScript做客户 ...

  6. java中的mapper是什么_Java使用ObjectMapper的简单示例

    一.什么是ObjectMapper? ObjectMapper类是Jackson库的主要类,它提供一些功能将数据集或对象转换的实现. 它将使用JsonParser和JsonGenerator实例来实现 ...

  7. 基于WebSocketSharp 的IM 简单实现

    websocket-sharp 是一个websocket的C#实现,支持.net 3.5及以上来开发服务端或者客户端.本文主要介绍用websocket-sharp来做服务端.JavaScript做客户 ...

  8. Go 使用 buger/jsonparser 优化反序列化性能

    前言 最近在做一个工具,从 日志系统 ES 集群导出数据,压缩然后上传到腾讯云存储,作为离线冷备份数据.在此过程中,遇到了数个性能问题. 其中 Elasticsearch SDK 的反序列化性能成为了 ...

  9. node.js + express + mysql 简单运用

    主要是学习下如何简单得运用,自己可以写出一个后台 目录 初始化一个项目 创建web服务 get请求 post put delete 三个请求 引入ejs 模板 中间件 cookie session 路 ...

最新文章

  1. Jedis无法远程连接阿里云服务器的redis问题
  2. linux u盘 挂载 type,Linux挂载U盘报错:mount: unknown filesystem type 'ntfs'
  3. 朝聚眼科完成4亿元B轮融资,兰馨亚洲和阳光融汇投资...
  4. 全网首译 : 初学者终极指南—掌握Scrum敏捷框架—第1章
  5. python学习之老男孩python全栈第九期_day004知识点总结
  6. tomcat 7 下添加 shared/lib 文件夹
  7. c语言程序设计教程 实验十,清华大学出版社-图书详情-《C语言程序设计实验教程》...
  8. python的concat用法_python的concat等多种用法详解
  9. C# DateTime简单的定时器用法
  10. 通过网络地址进行真机调试
  11. First of all, let’s talk about the richest man in Japan
  12. 腾讯云区块链产品负责人邵兵:产业区块链刚刚起步,做好基础设施才有可能进入2.0阶段
  13. python模块 包 文件_Python临时文件模块
  14. Mac上Jupyter之notebook快捷键
  15. csgo躲猫猫模式显示服务器已满,csgo躲猫猫攻略大全
  16. pythonATM,购物车项目实战_补充3——core模块
  17. 1114 Family Property (25 分)
  18. ESP8266固件SDK开发初体验-让ESP8266打印helloworld(基于安信可ESP-07)
  19. Excel字符函数(3):字符查找函数Find、Search
  20. 翻过这道山,就有人听到你的故事。

热门文章

  1. 学C语言,C++是自学好还是去培训机构?
  2. 日语学习(简单语法-2)
  3. 专业扒站利器使用介绍
  4. 英国哪些大学本科可以用ib English hl 成绩代替雅思成绩?
  5. 【uni-app】uni-app实现聊天页面功能——功能篇(下)
  6. 【RBF预测】基于时空 RBF-NN 实现混沌时间序列预测附matlab代码
  7. android handler的机制和原理_Android完整知识体系路线(菜鸟-资深-大牛必进之路)
  8. EXCEL VBA 备忘录
  9. elementui3
  10. GTO与OKR工具选择