首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    这里我们可以参考http://www.json.org/对 JSON 的定义,罗列一下 JSON 所规定的数据类型: BEGIN_OBJECT({) END_OBJECT(}) BEGIN_ARRAY(...我们可以定义一个枚举类来表示上面的数据类型,如下: public enum TokenType { BEGIN_OBJECT(1), END_OBJECT(2), BEGIN_ARRAY...this.reader = reader; buffer = new char[BUFFER_SIZE]; } /** * 返回 pos 下标处的字符...上面的解析流程虽然不是很复杂,但在具体实现的过程中,还是需要注意一些细节问题。比如: 在 JSON 中,字符串既可以作为键,也可以作为值。...作为键时,语法分析器期待下一个 Token 类型为 SEP_COLON。而作为值时,则期待下一个 Token 类型为 SEP_COMMA 或 END_OBJECT。

    1.4K10

    手写了一个简单的JSON解析器,网友直乎:牛!

    这里我们可以参考http://www.json.org/对 JSON 的定义,罗列一下 JSON 所规定的数据类型: BEGIN_OBJECT({) END_OBJECT(}) BEGIN_ARRAY(...我们可以定义一个枚举类来表示上面的数据类型,如下: public enum TokenType { BEGIN_OBJECT(1), END_OBJECT(2), BEGIN_ARRAY...this.reader = reader; buffer = new char[BUFFER_SIZE]; } /** * 返回 pos 下标处的字符...上面的解析流程虽然不是很复杂,但在具体实现的过程中,还是需要注意一些细节问题。比如: 在 JSON 中,字符串既可以作为键,也可以作为值。...作为键时,语法分析器期待下一个 Token 类型为 SEP_COLON。而作为值时,则期待下一个 Token 类型为 SEP_COMMA 或 END_OBJECT。

    1.5K30

    如何编写一个JSON解析器

    和XML相比,JSON本身结构非常简单,并且仅有几种数据类型,以Java为例,对应的数据结构是: "string":Java的String; number:Java的Long或Double; true/...解析JSON和解析XML类似,最终都是解析为内存的一个对象。出于效率考虑,使用流的方式几乎是唯一选择,也就是解析器只从头扫描一遍JSON字符串,就完整地解析出对应的数据结构。...但是单个字符要匹配的状态太多了,需要进一步把字符流变为Token,可以总结出如下几种Token: END_DOCUMENT:JSON文档结束; BEGIN_OBJECT:开始一个JSON object;...END_OBJECT:结束一个JSON object; BEGIN_ARRAY:开始一个JSON array; END_ARRAY:结束一个JSON array; SEP_COLON:读取一个冒号;...每当我们读到一个BEGIN_OBJECT时,就创建一个Map并压栈;每当读到一个BEGIN_ARRAY时,就创建一个List并压栈;每当读到一个END_OBJECT和END_ARRAY时,就弹出栈顶元素

    91900

    手摸手实现一个编译器(上)

    value // 函数体内的 value 是表达式 value:value 的前者,后者从其他规则中获取 JSON_text = ws value:value ws { return value; } begin_array...= ws "[" ws begin_object = ws "{" ws end_array = ws "]" ws end_object = ws "}" ws...// 最后就是 } // 整个表达式再做 members 是否为空的判断,是的话置为 {} object = begin_object members:( head:member...-- // 匹配数组的表达式 [1, 2, 3, a, b, c, {a: 1}] // 先是一个 [ // 紧接着匹配类型是 value 的 head // 然后匹配多次 : array = begin_array...我们从上到下开始看: "literal" | 'literal' 双引号或者单引号括起来的字面量都表示精确匹配,比如: begin_array = ws "[" ws 数组的开头匹配是 [,当然前后可以有空格

    75110

    FastAdmin前台分片传输上传文件getshell复现

    0x02 漏洞概述 2021年3月28日,360漏洞云漏洞研究员发现,FastAdmin框架存在有条件RCE漏洞,由于FastAdmin的前台文件上传功能中提供了分片传输功能, 但在合并分片文件时因对文件路径的拼接处理不当导致可上传任意文件...登陆后在个人资料头像处抓包并上传dog.jpg ? 更改上传数据包(需要注意图中几处红框的内容) ?...Content-Disposition: form-data; name="chunkindex"; 0 ------WebKitFormBoundaryurpjX18wIurjSyEp-- 上传成功之后,会在网站路径...连接,最后拼接 .part 最后保存到 /runtime/chunks/ 当我们传递的 chunkid 为 test.php , chunckindex 为 0 时(参数选择为0,还有别的原因,下表)...chunkid 的值指定为最后保存的文件名,然后回根据传入的参数chunkcount遍历查找是否分片文件上传完成,我们仅上传了一个分片文件,所以第一个分片文件应该设定为0,此处 chunkcount 的值应为

    5.8K40

    CSS 路径动画工具的诞生

    需求确定 一句话描述关键需求—— 重构中,可以快速的在重构界面中绘画出曲线的运动路径,并让元素在路径上运动,最终输出重构内容。...需求提炼 重构中,可以快速的在重构界面中绘画出曲线的运动路径,并让元素在路径上运动,最终输出重构内容。...“所见即所得”,应该以动画可视化为主,同时避免太多误操作,于是把以上模式和功能重新简化组合,再新增默认模式,如下表: 模式 操作 默认 不显示曲线,路径列表选择曲线路径 锚点模式(shift) 点击空白处...如下图,是两段贝塞尔曲线,弧长比值约1:1,故当t=0.5时,坐标点应近似位于P3处,公式参数应为“弧P0P3”,t=1;当t=0.75时,公式参数应为“弧P3P6”,t=0.5。...用微积分公式可以算处弧长,如下: 具体函数就不在此详解。通过以上公式,将曲线的点与CSS中keyframes的百分比一一对应,从而得到均等时间内点的位移,实现曲线上的匀速运动。

    4K01
    领券