精易论坛

标题: 分享个轻量级的 json解析器,基于Windows COM 组件,不依赖任何 [打印本页]

作者: 半神    时间: 2022-11-18 20:29
标题: 分享个轻量级的 json解析器,基于Windows COM 组件,不依赖任何
分享个轻量级的 json解析器,基于Windows COM 组件,不依赖任何外部库 和 任何模块。代码很少很干净。javaScript逻辑清晰,易懂易改。方便剪切移植。支持多线程安全。


简述:
           这是一个轻量级的Json解析器(操作器),基于Windows系统中自带的COM组件。
之前因项目需要,我开源过一个基于谷歌V8引擎的Json解析器。原帖地址如下(classV8Json 解析器):
https://125.confly.eu.org/forum.php?mod ... peid%26typeid%3D285

有个朋友向我反馈说:虽然V8引擎的执行效率很高,但V8引擎的DLL文件9MB多,在某些场景下,携带并不方便!
希望我能编写一个不依赖外部库的Json。于是,我编写了这个基于Windows COM 组件 Json解析器。
在功能上,classWinJson 与 classV8Json 是完全一样的(调用方法也完全一样)。

区别在于:
1. classWinJson 优点:不依赖任何外部库,缺点:效率比之前开源的 classV8Json 慢2%左右
2. classV8Json 优点:执行效率高一点,缺点:依赖一个9MB的V8引擎DLL库
我电脑上,classV8Json【运行速度测试】为:5618ms,classWinJson为:5841ms,相差不明显,我的CPU有点老:I7 3770k
classWinJson不算功能完美,但应该可以满足99.99%的需求。有兴趣的朋友可以在我的基础上再扩展一下。
本作保留了classV8Json的调用风格,用起来有javaScript原生代码的味道,调用可读性还不错。




科普:
       (老鸟请飞过)因易语言的脚本组件调用的是Windows系统COM组件,而COM是基于IE8自带的javaScript虚拟机,因此不支持ES5标准,也就没办法运行Json对象和Object.keys等相关代码,造成无法执行JSON解析器必要的关键代码。所以,只要我们自行往易语言的脚本对象里加载 json.js 和 keys.js插件,就能正常执行JSON关键代码了。从面实现浏览器V8引擎一样的JSON解析。json.js 由JSON官方开源在github上我下载的,keys.js是我自己写的。均内置在了源码的#长文本常量中。有兴趣的朋友可以下载源码后自己研究一下。




划重点:
  开源的初衷是因为我搜索json关键字的时候,发现不少人在寻找JSON解析器。希望我的小小力量能帮助到大家!
主要是代码量少,干净,方便移植,没什么可称道的地方。喜欢就拿去,不喜欢请路过。。。。




本源码里有四个调用案例,下面是截图(含输出结果)





01.调用例子_简单的测试(输出结果)




02.调用例子_数组的测试(输出结果)



03.调用例子_枚举测试(输出结果)



04.调用例子_生成打包Json(输出结果)



源码附件:
classWinJson.zip (10.63 KB, 下载次数: 140)










补充内容 (2022-11-18 23:37):
classWinJson 类没有公开,编译模块,自行公开一下就可以了(有人问为什么编译模块,classWinJson就不见了)。

补充内容 (2022-11-19 12:36):
classWinJson VS 精易的类_json 如下:
类_json 优点:功能非常全面,缺点:1.本人亲测执行速度比classWinJson 慢6倍左右,2.表达式抽象不自然,小白不易上手...
作者: 56tt    时间: 2022-11-18 20:50
感谢分享,很实用,学习一下
作者: 283688410    时间: 2022-11-18 20:59
谢谢楼主分享
作者: 亿万    时间: 2022-11-18 21:10
        支持开源~!感谢分享
作者: callng    时间: 2022-11-18 21:31
确实厉害,!
作者: quary888    时间: 2022-11-18 21:32
谢谢楼主分享!!! 好人一生平安!!!
作者: 冯古屋    时间: 2022-11-18 21:35
你可以去参加开源大赛呀
作者: Elite    时间: 2022-11-18 21:39
等待大神们的评论
作者: kimeti    时间: 2022-11-18 21:58
为什么编译成模块的时候就没有classWinJson这个类了
作者: bianyuan456    时间: 2022-11-18 22:27
感谢分享。精易模块的类_json就是用对象去做的呀,跟楼主的一样吧。。不知道有何区别
作者: bianyuan456    时间: 2022-11-18 22:44
本帖最后由 bianyuan456 于 2022-11-18 22:48 编辑

虽然com组件没JSON.parse但是可以用eval来替代呀!
感谢楼主分享
作者: 半神    时间: 2022-11-18 23:25
kimeti 发表于 2022-11-18 21:58
为什么编译成模块的时候就没有classWinJson这个类了

没有公开,设置一下公开就可以了
作者: 半神    时间: 2022-11-18 23:26
bianyuan456 发表于 2022-11-18 22:27
感谢分享。精易模块的类_json就是用对象去做的呀,跟楼主的一样吧。。不知道有何区别 ...

区别还是很大的,对比一下就知道了
作者: 半神    时间: 2022-11-18 23:27
bianyuan456 发表于 2022-11-18 22:44
虽然com组件没JSON.parse但是可以用eval来替代呀!
感谢楼主分享

JSON.stringify 和 Object.keys 呢?
作者: 半神    时间: 2022-11-18 23:33
bianyuan456 发表于 2022-11-18 22:44
虽然com组件没JSON.parse但是可以用eval来替代呀!
感谢楼主分享

用纯 eval()确实可以代替JSON.parse()。但会留下一个问题:如果应用在服务端,客户Duan可以利用json发起注入代码!是个严重的安全漏洞,网上相关帖子不少,有兴趣你可以查查。另外 JSON.stringify 和 Object.keys 仍然不能解决。不能解决 Object.keys就不能枚举。
作者: 名无所谓    时间: 2022-11-19 06:21
感谢分享
作者: wuqingg    时间: 2022-11-19 08:44
        支持开源~!感谢分享
作者: dljy    时间: 2022-11-19 09:28
        新技能已get√
作者: bianyuan456    时间: 2022-11-19 09:33
半神 发表于 2022-11-18 23:33
用纯 eval()确实可以代替JSON.parse()。但会留下一个问题:如果应用在服务端,客户Duan可以利用json发起 ...

感谢楼主解答的知识,这些知识学习了
作者: lity2310    时间: 2022-11-19 10:55
感谢分享
作者: shuaier    时间: 2022-11-19 11:11
支持开源~!感谢分享
作者: kyo9766    时间: 2022-11-19 14:31
学习一下,这样可以不用带着一个dll了,感谢分享
作者: xh1020    时间: 2022-11-19 16:18
坐等大佬完善...
作者: wjswzj0    时间: 2022-11-19 16:34
支持开源~!感谢分享
作者: 林子枫    时间: 2022-11-19 17:37
祝论坛人qi越来越旺

作者: 星辰ovo    时间: 2022-11-19 17:56
666666666666666666
作者: uyhj    时间: 2022-11-19 18:41
支持开源~!感谢分享
作者: minews    时间: 2022-11-20 03:38
%E5%88%86%E4%BA%AB%E4%B8%AA%E8%BD%BB%E9%87%8F%E7%BA%A7%E7%9A%84%20json%E8%A7%A3%E6%9E%90%E5%99%A8%EF%BC%8C%E5%9F%BA%E4%BA%8EWindows%20COM%20%E7%BB%84%E4%BB%B6%EF%BC%8C%E4%B8%8D%E4%BE%9D%E8%B5%96%E4%BB%BB%E4%BD%95
作者: rgbhje    时间: 2022-11-20 08:54
感谢分享 感谢分享
作者: 猩猩之火    时间: 2022-11-20 16:53
不错的亚子
作者: 396384183    时间: 2022-11-21 01:33


感谢, 学习一下
作者: kingchain    时间: 2022-11-21 08:05
感谢分享!
作者: jtucar    时间: 2022-11-21 20:37
感谢分享,很给力!~
作者: sostemp    时间: 2022-11-22 14:02
        新技能已get√
作者: 蒙顺童    时间: 2022-11-22 22:10
666666666666666666666666666666666666666666
作者: QiLin88    时间: 2022-11-23 18:48
666666666666666666666666666666666666
作者: By未命名    时间: 2022-11-24 21:45
感觉易语言还是用中文比较好,写易语言里面代码全部用英文……
作者: yang9644    时间: 2022-11-25 16:35
在线程下测试“classWinJson”类只有局部变量能正常,全局与程序集变量失效,不知道是不是我个人电脑问题。
作者: yuyessa    时间: 2022-12-5 16:11
学习了
作者: kic1234    时间: 2023-1-25 23:48
编译后模块引用失败!!!!
作者: liuyuxin188    时间: 2023-2-1 01:17
支持开源~!感谢分享
作者: 149510261    时间: 2023-2-1 16:39
qqqqqqqqqqqqqwwwwwwwwwwww
作者: year1970    时间: 2024-4-22 10:21
感谢分享
作者: a57262    时间: 2024-5-10 09:06
666666666666666666666666666666
作者: cch23456    时间: 2024-8-9 00:12
支持开源 感谢分享
作者: 网络注册会员    时间: 2024-11-28 21:06
支持开源
作者: duzijie    时间: 2025-6-8 11:28
学习一下啊





欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4