开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 18825|回复: 75
收起左侧

[2016开源大赛(第一届)] [天朝红雨]最优雅的Json模块2016-12-19

[复制链接]
发表于 2016-12-19 22:33:00 | 显示全部楼层 |阅读模式   广东省广州市
本帖最后由 m199312 于 2016-12-19 22:39 编辑

本次发布的算是本人为易语言JSON事业贡献的第三个大版本。
上个版本:http://bbs.eyuyan.com/read.php?tid=387876

官方论坛:http://bbs.eyuyan.com/read.php?tid=397739

本此版本三大特点:《优雅》、《面向对象》、《高效》、《稳定》。
  • 优雅

(生成Json有着媲美甚至超越JScript的体验)
如果要生成一段这样的JSON文本:
{
    "开发商信息":
    {
        "公司名":    "异编软件",
        "网址":    "http://www.ybrj.net"
    },
    "鸣谢":
    [
        {
            "公司名":    "云外归鸟工作室",
            "网址":    "http://www.ywgn.net"
        },
        {
            "公司名":    "易语言软件开发有限公司",
            "网址":    "http://www.eyuyan.com"
        }
    ]
}
  • JScript方式(11行代码):
var json={};
json.开发商信息={};
json.开发商信息.公司名="异编软件";
json.开发商信息.网址="http://www.ybrj.net";
json.鸣谢=[];
json.鸣谢[0]={};
josn.鸣谢[0].公司名="云外归鸟工作室";
josn.鸣谢[0].网址="http://www.ywgn.net";
json.鸣谢[1]={};
josn.鸣谢[1].公司名="易语言软件开发有限公司";
josn.鸣谢[1].网址="http://www.eyuyan.com";

  • 传统的方式(21行代码):
json.置项目值("","{}")
json.插入项目("","开发商信息")
json.置项目值("开发商信息","{}")
json.插入项目("开发商信息","公司名")
json.置项目值("开发商信息.公司名","异编软件")
json.插入项目("开发商信息","网址")
json.置项目值("开发商信息.网址","http://www.ybrj.net")
json.插入项目("","鸣谢")
json.置项目值("鸣谢","[]")
json.插入项目("鸣谢","0")
json.置项目值("鸣谢[0]","{}")
json.插入项目("鸣谢[0]","公司名")
json.置项目值("鸣谢[0].公司名","云外归鸟工作室")
json.插入项目("鸣谢[0]","网址")
json.置项目值("鸣谢[0].网址","http://www.ywgn.net")
json.插入项目("鸣谢","1")
json.置项目值("鸣谢[1]","{}")
json.插入项目("鸣谢[1","公司名")
json.置项目值("鸣谢[1].公司名","易语言软件开发有限公司")
json.插入项目("鸣谢[1]","网址")
json.置项目值("鸣谢[1].网址","http://www.eyuyan.com")
  • Json类模块的方式(6行代码):
json.K("开发商信息").K("公司名").置文本("异编软件")
json.K("开发商信息").K("网址").置文本("http://www.ybrj.net")
json.K("鸣谢").I(0).K("公司名").置文本("云外归鸟工作室")
json.K("鸣谢").I(0).K("网址").置文本("http://www.ywgn.net")
json.K("鸣谢").I(1).K("公司名").置文本("易语言软件开发有限公司")
json.K("鸣谢").I(1).K("网址").置文本("http://www.eyuyan.com")



  • 面向对象

类中两大关键方法,均返回Json类型对象。
Json.I() '以数组下标方式获得成员,返回一个Json类型的对象(即返回一个和调用类型一样的对象)。
Json.K() '以键名方式获得成员,返回一个Json类型的对象
             意味着一句代码可以无限层次进入子对象中,比如这样的json中:
{data:[ obj:{ code: 8 , data:[ msg:{ error :-8 ,errorData:{ text: 'Incorrect password' , date:1451577600}} ] } ]}
              只需如下代码便可获得错误原因
错误原因=Json.K("data").I(0).K("data").K("msg").K("errorData").K("text").取文本()
              当然新的版本还保留了传统的表达式方式取得对象,虽然已不推荐使用(表达式方式没有IDE提示,而且需要自己检查语法错误等缺点),具体用法如下:
错误原因=Json.X("data[0].data.msg.errorData.text").取文本()
  • 高效

弃用上一版的自研发内核(虽然上一版容错能力惊人,但执行效率较低,短期内没有精力改进)转采用Win32API中的JScript引擎辅以内联汇编实现了类似于Java的对象引用机制,即 Json.I()  /  Json.K()  /  Json.X()   所返回的对象实际上和调用对象其实是绑定的同一个Jscript对象,因此相比上个版本可大幅提高解析和查找速度。
  • 稳定

依托于对象引用机制,无论对哪个子对象进行改变,都能稳定同步更新,而且本版集成了JSONP跨域格式的解析功能,再也不用为这样的数据格式伤脑筋了“_callback1451577600({code:-10086,msg:'密码错误!'})”。
  • 其他注意事项

复制变量不可以使用如下方式直接复制(因对象引用机制有着引用数计次,直接复制会导致计次异常而提前释放内存继而引发程序崩溃)。
错误的方法演示:
Json2=Json1
正确做法:
Json2=Json1.复制()


---------------关于多线程-----------------
模块默认为多线程方式初始化的COM库,值得注意的是精易模块中有很多命令都会卸载多线程初始化(比如正则、网页访问等都会调用卸载CoUninitialize()),他们会造成程序崩溃,如果要兼容精易模块请不要调用本方法(多线程初始化COM() ),并在每个线程首次使用Json类的方法前加上  单线程初始化COM()。 注:这样初始化的变量不支持多线程共享,只能被最先使用的线程使用。

  • 下载地址(模块源码中有使用方法) [面向对象]Json.zip (646.67 KB, 下载次数: 1292)
QQ截图20161219222938.jpg

点评

评论拿走..厉害   广东省广州市  发表于 2017-11-28 10:02

评分

参与人数 5好评 +4 精币 +10 收起 理由
kjy0928 + 1 感谢分享,很给力!~
borr + 1 + 1 这个解决了好多问题,太棒了~!
liuxin5163 + 1 + 1 感谢分享,很给力!~
自强不息 + 1 + 2 很好很强悍,坚持下去哦~
冰点 + 1 + 5 支持开源~!感谢分享

查看全部评分

本帖被以下淘专辑推荐:

签到天数: 7 天

发表于 2023-2-13 16:38:54 | 显示全部楼层   江苏省常州市
赶紧下载  学习
回复 支持 反对

使用道具 举报

签到天数: 4 天

发表于 2022-11-25 15:30:50 | 显示全部楼层   山东省潍坊市
赶紧下载  学习
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 2022-2-22 11:47:17 | 显示全部楼层   广西壮族自治区南宁市
大兔崽子 发表于 2017-8-29 22:28
楼主,昂  我来报道个情况   貌似是bug
恩 是这样的  就是我在循环用线程启动的子程序中用了这个json 后   ...

模块很好用,但是确实有这个问题。
回复 支持 反对

使用道具 举报

发表于 2021-12-20 10:56:49 | 显示全部楼层   浙江省绍兴市

学习了,感谢分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2021-12-6 12:11:49 | 显示全部楼层   贵州省黔南布依族苗族自治州

多这样的高手,生活就好了
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)
发表于 2021-11-22 12:46:39 | 显示全部楼层   河北省廊坊市
mk json模块
回复 支持 反对

使用道具 举报

发表于 2021-6-6 15:29:58 | 显示全部楼层   浙江省绍兴市
正在寻找,希望符合需求!
回复 支持 反对

使用道具 举报

发表于 2020-12-27 07:58:56 | 显示全部楼层   广西壮族自治区北海市
6666666666666666666666666666
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2020-11-26 22:56:32 | 显示全部楼层   广东省深圳市
谢谢开源分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/10)

签到天数: 1 天

发表于 2019-7-13 19:54:00 | 显示全部楼层   江西省上饶市
顶一下,蛮好的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表