前言

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

同时这次也更新了一个版本,主要是两个升级:

  1. 对转义字符的支持。
  2. 性能优化,大约提升了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 字符串以及计算公式然后得到计算结果。

其实实现原理也比较简单,总共分为是三步:

  1. json 进行词法分析,得到一个四则运算的第一步 token
  2. 基于该 token 流,生产出最终的四则运算表达式,比如 (3+2)*5
  3. 调用四则运算处理器,拿到最终结果。

先看第一步,根据 (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 是如何实现四则运算的?的更多相关文章

  1. 介绍一款原创的四则运算算式生成器:CalculateIt2

    家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...

  2. 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序

    1. 编写一个能自动生成小学四则运算题目的程序.(10分)   基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图.   本题发一篇随笔,内容包括: 题 ...

  3. 四则运算appNABCD模型

    团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...

  4. 第一章-第一题(小学生四则运算)--By郭青云

    1.项目需求 a) 除了整数以外,还要支持真分数的四则运算. (例如:  1/6 + 1/8 = 7/24) b) 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. c) 逐步扩 ...

  5. 一个简易的四则运算单元...(15.12.15 BUG更新)

    网上找的, 没有作者信息, 只能在这里感谢一下了, 支持标准写法的四则运算 --2015-12-15 修改了一个内存泄漏的BUG - Pop方法没有释放申请的内存 unit Base.Calculat ...

  6. 利用ANTLR4实现一个简单的四则运算计算器

    利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...

  7. 【实践】js实现简易的四则运算计算器

    最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...

  8. HDU 5938 Four Operations(四则运算)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  9. C语言实现四则运算

    学生:宋丹丹 张潇裕 #include<iostream>#include<ctime>using namespace std;void main(){ int x1,x2,a ...

随机推荐

  1. Python 工匠:使用数字与字符串的技巧

    序言 这是 "Python 工匠"系列的第 3 篇文章. 数字是几乎所有编程语言里最基本的数据类型,它是我们通过代码连接现实世界的基础.在 Python 里有三种数值类型:整型(i ...

  2. 论文解读(GROC)《Towards Robust Graph Contrastive Learning》

    论文信息 论文标题:Towards Robust Graph Contrastive Learning论文作者:Nikola Jovanović, Zhao Meng, Lukas Faber, Ro ...

  3. macOS 安装 Nebula Graph 看这篇就够了

    本文首发于 Nebula Graph Community 公众号 背景 刚学习图数据的内容,当前网上充斥大量的安装文档,参差不齐,部署起来令人十分头疼. 现整理一份比较完整的安装文档,供大家学习参考, ...

  4. 2003031121——浦娟——Python数据分析第七周作业——MySQL的安装及使用

    项目 要求 课程班级博客链接 20级数据班(本) 作业要求链接 Python第七周作业 博客名称 2003031121--浦娟--Python数据分析第七周作业--MySQL的安装及使用 要求 每道题 ...

  5. 用浏览器快速开启Docker的体验之旅

    互联网科技发展创造了很多奇迹,比如我今天要提到的 docker 技术就是其一.我很早就关注它(在2015年写过这方面的博客),那会儿还只是一个开源项目,现在已经是一个行业事实标准了,它推动了云原生的变 ...

  6. JS 加载

    DOM 加载完毕后执行,不需要等待image.js.css.iframe等加载 1.$(function() {}) 2.$(document).ready(function() {})  不要写成 ...

  7. linux的简介与安装

    linux简介: https://www.cnblogs.com/pyyu/p/9277153.html Linux就是个操作系统:它和Windows XP.Windows7.8.10什么的一样就是一 ...

  8. 关于win10安装wsl子系统Ubuntu图形界面的错误解决

    解决了https://blog.csdn.net/weixin_30834783/article/details/102144314Xserver个人使用的是VcXsrv. 在WSL中配置环境变量DI ...

  9. JavaMetaweblogClient,Metaweblog的java实现-从此上传博客实现全平台

    目录 1. 什么是Metaweblog? 2. Metaweblog的应用 3. 如何使用Metaweblog 4. 本项目介绍 4.1 metaweblog与java之间的关系映射 4.2 使用Ja ...

  10. python面向对象双下划线方法与元类

    目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...