前言

上一篇中介绍了 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. 红旗 Linux 桌面操作系统11来了:支持国产自主CPU,全新UI风格设计,兼容面广...

    链接:https://reurl.cc/g8ke9X 红旗Linux桌面操作系统11将于1月10日开放预览版的下载,新版本具有良好的硬件兼容,支持多款国产自主CPU品牌,同时还具有丰富的外设支持及海量 ...

  2. 使用 .net + blazor 做一个 kubernetes 开源文件系统

    背景 据我所知,目前 kubernetes 本身或者其它第三方社区都没提供 kubernetes 的文件系统.也就是说要从 kubernetes 的容器中下载或上传文件,需要先进入容器查看目录结构,然 ...

  3. go convert slice to struct

    Question: in golang how to convert slice to struct scene 1:use reflect convert slice to struct func ...

  4. 国产化设备鲲鹏CentOS7上源码安装Python3.7

    具体编译过成与正常的Python源代码在x86平台上的过程无异,此篇随笔仅当用作复制黏贴的备忘录.不得不说在一个老旧系统上安装一个老旧的Python版本,从头编译一个Python还是一个较为稳健的选择 ...

  5. form表单,css简介,css选择器,css样式操作

    form表单 简介 表单在Web网页中用以让访问者输入数据,当提交表单时,表单中输入的数据被打包传递给Web服务器端的程序 以处理,从而使得Web服务器与用户之间具有交互功能. 表单实现前后台交互:用 ...

  6. WinUI迁移到即将"过时"的.NET MAUI个人体验

    迁移的初衷 本人平时是做.net相关的工作,对于.net技术栈也有一些了解,自从新的.net能够跨平台之后,之前也有跨平台的ui框架Xamarin,现在微软推出了.NET MAUI这个说是 统一了开发 ...

  7. 使用python获取交换机syslog日志并使用jQuery在html上展示

    需求 现网有部分pop点独立于海外,无法发送日志给内网日志服务器,同时最近网内有比较重要割接,所以临时写一个脚本来展示网内日志 思路 使用socket接收syslog数据,udp 514,数据部分格式 ...

  8. 精彩分享 | 欢乐游戏 Istio 云原生服务网格三年实践思考

    作者 吴连火,腾讯游戏专家开发工程师,负责欢乐游戏大规模分布式服务器架构.有十余年微服务架构经验,擅长分布式系统领域,有丰富的高性能高可用实践经验,目前正带领团队完成云原生技术栈的全面转型. 导语 欢 ...

  9. Python写安全小工具-TCP全连接端口扫描器

    通过端口扫描我们可以知道目标主机都开放了哪些服务,下面通过TCP connect来实现一个TCP全连接端口扫描器. 一个简单的端口扫描器 #!/usr/bin/python3 # -*- coding ...

  10. 论文阅读 Dynamic Network Embedding by Modeling Triadic Closure Process

    3 Dynamic Network Embedding by Modeling Triadic Closure Process link:https://scholar.google.com.sg/s ...