Java实现Json解析器

本文介绍了如何使用Java实现一个Json解析器,包括词法解析和语法解析两个阶段。词法解析涉及Type、JsonLex和LeptType类,而语法解析则依赖于Status、StateMachine、OPT和Operator类。作者强调没有使用递归,避免了JVM调用堆栈溢出的问题,并提供了测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开始正文之前,先给大家推荐一些学习技巧:

  • 大牛的C语言版JOSN,万事开头难,我开始在网上找资料就花了很长时间,而且资料太多,众说纷纭…但是最后找到了这个大牛的,真的写的超级好,超级详细,虽然他是用C语言写的,哈哈~就这样我跟着大牛的文档和代码写了一遍C语言的JSON后,对JSON的语法以及实现有了一个初级的了解,然后,我就开始着手写Java版的JSON啦
  • 在线JOSN校验格式化工具,如果在解析字符串的时候,拿不准这个是不是正确的JOSN,你可以在这个上面测试一下,有利于对自己代码的测试(我的测试代码写的特别挫,后序再改进,哈哈)
  • 温馨提示:代码有点长,所以不会全部粘贴,可以先下载(Java实现Json解析器)下来再看文哦~
  • 温馨提示:不建议大家看源码…因为我在写之前,为了看起来专业一点,然后我就想要不要用一下人家的源码的接口或者参考一下人家的代码什么的…然后我就开始了看fastjosn源码的不归路…看了一下午,我放弃了,实在是看不太懂哇~但是要是想看的话也可以看看,学学人家的代码,也没有什么坏处

总体介绍

其次,说一下,整个JSON解析使用的是遍历分析(词法解析)、灵活应用堆栈来实现(语法解析),没有使用递归方式,这样就免受了JVM调用堆栈溢出问题的困饶。
先看看文件结构

在这里插入图片描述
Lexical-----词法解析,就是字符串解析(主要就是解析为true、false、null、String、num这几种基本类型)。Type类,定义了JOSN的数据类型;JsonLex类就是粗略的判断了下输入数据的JSON类型和大概的值;LeptType类保存数据的类型和真实值;UnexpectedException类自定义一个捕获错误类,用于报错。
Grammar-----语法解析,就是利用栈和HashMap等数据结构来解析数组和对象这两种符合结构。STATE类,定义状态常量;StateMachine类(总指挥官)将所有状态转化都联系起来实现JSON解析器;OPT类定义操作常量;Operator类具体操作类。

看文档顺序

  • 词法解析:TestJsonLex->Type->JsonLex->LeptType->UnexpectedException
  • 语法解析:TestJsonGrammar->JSON->Status->StatusMachine->OPT->Operator

词法解析

主要就是解析为true、false、null、String、num这几种基本类型。
Type类:
在这里插入图片描述
定义‘[’ ‘]’ ‘{’ ‘}’ ‘,’ ':'等类型是为了后面状态转换用。

JsonLex类:

 public LeptType leptParseValue() {
        if (lineNum == 0) {
            lineNum++;
            return LeptType.BGN;
        }
        char ch;
        while ((ch = nextChar()) != 0) {
            startLine = this.lineNum;
            startCol = getColNum();
            switch (ch) {
                case '[':
                    return LeptType.ARRS;
                case ']':
                    return LeptType.ARRE;
                case '{':
                    return LeptType.OBJS;
                case '}':
                    return LeptType.OBJE;
                case ',':
                    return LeptType.SPLIT;
                case ':':
                    return LeptType.DESC;
                case 't':
                case 'f':
                case 'n':
                    return getDefLeptType();
                case '&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值