XJSON 是如何实现四则运算的?

前言
在上一篇中介绍了 xjson 的功能特性以及使用查询语法快速方便的获取 JSON 中的值。

同时这次也更新了一个版本,主要是两个升级:
- 对转义字符的支持。
- 性能优化,大约提升了30%️。
转义字符
先说第一个转义字符,不管是原始 JSON 字符串中存在转义字符,还是查询语法中存在转义字符都已经支持,具体用法如下:
str = `{"1a.b.[]":"b"}`
get = Get(str, "1a\\.b\\.\\[\\]")
assert.Equal(t, get.String(), "b")
str = `{".":"b"}`
get = Get(str, "\\.")
assert.Equal(t, get.String(), "b")
str = `{"a":"{\"a\":\"123\"}"}`
get = Get(str, "a")
fmt.Println(get)
assert.Equal(t, get.String(), "{\"a\":\"123\"}")
assert.Equal(t, Get(get.String(), "a").String(), "123")
str = `{"a":"{\"a\":[1,2]}"}`
get = Get(str, "a")
fmt.Println(get)
assert.Equal(t, get.String(), "{\"a\":[1,2]}")
assert.Equal(t, Get(get.String(), "a[0]").Int(), 1)
性能优化
性能也有部分优化,大约比上一版本提升了 30%。
pkg: github.com/crossoverJie/xjson/benckmark
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkDecode-12 14968 77130 ns/op 44959 B/op 1546 allocs/op
PASS
------------------------------------
pkg: github.com/crossoverJie/xjson/benckmark
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkDecode-12 19136 62960 ns/op 41593 B/op 1407 allocs/op
PASS
但总体来说还有不少优化空间,主要是上限毕竟低,和官方库比还是有不小的差距。
实现四则运算
接下来聊聊四则运算是如何实现的,这本身算是一个比较有意思的 feature,虽然用的场景不多。
先来看看是如何使用的:
json :=`{"alice":{"age":10},"bob":{"age":20},"tom":{"age":20}}`
query := "(alice.age+bob.age) * tom.age"
arithmetic := GetWithArithmetic(json, query)
assert.Equal(t, arithmetic.Int(), 600)
输入一个 JSON 字符串以及计算公式然后得到计算结果。
其实实现原理也比较简单,总共分为是三步:
- 对
json进行词法分析,得到一个四则运算的第一步token。 - 基于该
token流,生产出最终的四则运算表达式,比如(3+2)*5 - 调用四则运算处理器,拿到最终结果。
先看第一步,根据 (alice.age+bob.age) * tom.age 解析出 token:

第二步,解析该 token,碰到 Identifier 类型时,将其解析为具体的数据。

而其他类型的 token 直接拼接字符串即可,最终生成表达式:(10+20)*20
这一步的核心功能是由
xjson.Get(json, query)函数提供的。
关键代码如下图所示:

最终的目的就是能够生成一个表达式,只要拿到这个四则运算表达式便能得到最终计算结果。
而最终的计算逻辑其实也挺简单,构建一个 AST 树,然后深度遍历递归求解即可,如下图所示:

这一步的核心功能是有之前实现的脚本解释器 gscipt 提供的。
感兴趣的朋友可以查看源码。
总结
一个 JSON 库的功能其实并不多,欢迎大家分享平时用 JSON 库的常用功能;也欢迎大家体验下这个库。
源码地址:
https://github.com/crossoverJie/xjson
XJSON 是如何实现四则运算的?的更多相关文章
- 介绍一款原创的四则运算算式生成器:CalculateIt2
家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
1. 编写一个能自动生成小学四则运算题目的程序.(10分) 基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图. 本题发一篇随笔,内容包括: 题 ...
- 四则运算appNABCD模型
团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...
- 第一章-第一题(小学生四则运算)--By郭青云
1.项目需求 a) 除了整数以外,还要支持真分数的四则运算. (例如: 1/6 + 1/8 = 7/24) b) 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. c) 逐步扩 ...
- 一个简易的四则运算单元...(15.12.15 BUG更新)
网上找的, 没有作者信息, 只能在这里感谢一下了, 支持标准写法的四则运算 --2015-12-15 修改了一个内存泄漏的BUG - Pop方法没有释放申请的内存 unit Base.Calculat ...
- 利用ANTLR4实现一个简单的四则运算计算器
利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...
- 【实践】js实现简易的四则运算计算器
最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- C语言实现四则运算
学生:宋丹丹 张潇裕 #include<iostream>#include<ctime>using namespace std;void main(){ int x1,x2,a ...
随机推荐
- python练习-20200826
1:L = [ ['Apple', 'Google', 'Microsoft'], ['Java', 'Python', 'Ruby', 'PHP'], ['Adam', 'Bart','Lisa'] ...
- XCTF练习题---MISC---快乐游戏题
XCTF练习题---MISC---快乐游戏题 flag:UNCTF{c783910550de39816d1de0f103b0ae32} 解题步骤: 1.观察题目,下载附件 2.还真是一个游戏,赢了就得 ...
- 基础学习:社会工程学---利用Kali下的setoolkit进行钓鱼网站制作
利用Kali下的setoolkit进行钓鱼网站制作 1.打开kali2019,输入setoolkit,打开setoolkit模块 2.输入命令1,进入钓鱼攻击页面 3.输入命令2,进入web钓鱼攻击页 ...
- sqlx操作MySQL实战及其ORM原理
sqlx是Golang中的一个知名三方库,其为Go标准库database/sql提供了一组扩展支持.使用它可以方便的在数据行与Golang的结构体.映射和切片之间进行转换,从这个角度可以说它是一个OR ...
- 操作系统实现-boot.asm实现
博客网址:www.shicoder.top 微信:18223081347 欢迎加群聊天 :452380935 这一次我们进入操作系统实现的真实编码, 这一次主要是完善对boot.asm文件的全部实现, ...
- 使用C#跨PC 远程调用程序并显示UI界面
在项目中有一个需求是需要在局域网内跨PC远程调用一个程序,并且要求有界面显示,调查了一些资料,能实现远程调用的.Net技术大概有PsExec.WMI.Schedule Task. 这三种方式都做了一个 ...
- CSS 不规则的轮廓-outline
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- Golang:手撸一个支持六种级别的日志库
Golang标准日志库提供的日志输出方法有Print.Fatal.Panic等,没有常见的Debug.Info.Error等日志级别,用起来不太顺手.这篇文章就来手撸一个自己的日志库,可以记录不同级别 ...
- 资讯:IEEE1
IEEE 2020 年 12 大技术趋势:边缘计算.量子计算.AI.数字孪生等 2020-02-06 以下是对2020年12大技术趋势的预测.IEEE计算机协会自2015年以来一直在预测技术趋势,其年 ...
- 网络编程之socket套接字
目录 socket套接字简介 socket模块 通信循环 代码优化 连接循环 半连接池 黏包问题 解决黏包问题 黏包问题特殊情况(文件过大) socket套接字简介 由于操作OSI七层是所有C/S架构 ...