精易论坛

标题: 易语言JSON解析支持库,支持复杂格式解析/生成,常用编码转换等功能。 [打印本页]

作者: 黑猫よ__    时间: 2017-5-3 13:52
标题: 易语言JSON解析支持库,支持复杂格式解析/生成,常用编码转换等功能。
本帖最后由 黑猫よ__ 于 2017-5-3 13:55 编辑

          JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,它基于ECMAScript规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。


      本支持库以开源库《JSONCPP》为基础,进行扩展开发而来,支持标准JSON格式数据的解析和生成。





解析例子:


{
"test1":"Hello World!",
"test2":100,
"test3":3.14,
"test4":true,
"test5":4294967296,
"test6":{"child1":"1111","child2":"2222"},
"array":[{"app1":"aaaa","app2":"bbbb"},{"app1":"cccc","app2":"dddd"}]
}

  
子程序名返回值类型公开备 注
_启动子程序整数型 本子程序在程序启动后最先执行
变量名类 型静态数组备 注
ReaderJson::ReaderJSON解析引擎
RootJson::Value根节点对象
ArrayJson::Value数组对象
i整数型 
test1Json::Value 
判断 (Reader.从文本解析 ( #常量1, Root))
调试输出 (Root.At (“test1”).asString ())  ' 输出文本型值
调试输出 (Root.At (“test2”).asInt ())  ' 输出整数型值
调试输出 (Root.At (“test3”).asDouble ())  ' 输出双精度小数型值
调试输出 (Root.At (“test4”).asBool ())  ' 输出逻辑型值
调试输出 (Root.At (“test5”).asInt64 ())  ' 输出长整数型值
调试输出 (“===========================================================”)
调试输出 (Root.At (“test6”).At (“child1”).asString ())  ' 取出JSON对象中的成员值
调试输出 (“===========================================================”)
Array = Root.At (“array”)
如果真 (Array.isArray ())  ' 是否为数组对象
调试输出 (“数组长度:”, Array.Length ())
计次循环首 (Array.Length (), i)
调试输出 (i, Array.Index (i - 1).At (“app1”).asString ())  ' 数组下标从0开始,取出数组对象中的成员值
计次循环尾 ()
调试输出 (“===========================================================”)
test1 = Root.At (“test1”)
调试输出 (“状态判断:”)
调试输出 (“是否为文本型: ”, test1.isString ())
调试输出 (“是否为逻辑型: ”, test1.isBool ())
调试输出 (“是否为整数型: ”, test1.isInt ())
调试输出 (“是否为双精度小数型: ”, test1.isDouble ())
调试输出 (“是否为长整数型: ”, test1.isInt64 ())
调试输出 (“是否为空: ”, test1.isNull ())
调试输出 (“是否为对象: ”, test1.isObject ())
调试输出 (“是否为数组: ”, test1.isArray ())


调试输出 (“解析失败,错误信息: ”, Reader.取错误信息 ())

标准输入 ()
返回 (0)  ' 可以根据您的需要返回任意数值



i支持库列表   支持库注释   
JsonReader(未知支持库)
spec特殊功能支持库


* “Hello World!”
* 100
* 3.140000
* 真
* 4294967296
* “===========================================================”
* “1111”
* “===========================================================”
* “数组长度:” | 2
* 1 | “aaaa”
* 2 | “cccc”
* “===========================================================”
* “状态判断:”
* “是否为文本型: ” | 真
* “是否为逻辑型: ” | 假
* “是否为整数型: ” | 假
* “是否为双精度小数型: ” | 假
* “是否为长整数型: ” | 假
* “是否为空: ” | 假
* “是否为对象: ” | 假
* “是否为数组: ” | 假

生成例子:

  
子程序名返回值类型公开备 注
_启动子程序整数型 本子程序在程序启动后最先执行
变量名类 型静态数组备 注
RootJson::Value根对象
ObjectJson::Value子对象
ArrayJson::Value数组对象
item1Json::Value数组成员对象
item2Json::Value数组成员对象
Root.Add (“test1”, “1111”)  ' 添加文本型值
' Root.Add (“test1”, 100)  ' 修改"test1"的值
Root.Add (“test2”, 1024)  ' 添加整数型值
Root.Add (“test3”, )  ' 添加逻辑型值
Root.Add (“test4”, #pi )  ' 添加双精度小数型值
Root.Add (“test5”, 4294967296)  ' 添加长整数型值
' ========================================================
Object.Add (“child1”, “1111”)
Object.Add (“child2”, “2222”)
Root.Add (“object”, Object)  ' 添加JSON对象
' ========================================================
item1.Add (“min”, “aaaa”)
item1.Add (“max”, “bbbb”)
item2.Add (“min”, “cccc”)
item2.Add (“max”, “dddd”)
Array.Append (item1)  ' 将item1对象加入数组
Array.Append (item2)  ' 将item2对象加入数组
Root.Add (“array”, Array)  ' 将数组对象加入到根对象中
' ========================================================
信息框 (Root.toStyledString (), 0, , )  ' 输出带格式的JSON文本。
标准输入 ()
返回 (0)  ' 可以根据您的需要返回任意数值



i支持库列表   支持库注释   
JsonReader(未知支持库)





常用编码转换例子:

  
子程序名返回值类型公开备 注
_启动子程序整数型 本子程序在程序启动后最先执行
调试输出 (A2W (“你好!”))  ' ANSI转Unicode
调试输出 (W2A ({ 96, 79, 125, 89, 33, 0, 0, 0 }))  ' Unicode转ANSI
调试输出 (A2T (“你好!”))  ' ANSI转UTF-8
调试输出 (T2A (“浣犲ソ!”))  ' UTF-8转ANSI
' ======================================================
' 常用格式化字符串转换
调试输出 (格式化字符串 (“你好!”, 真, 0))  ' 将文本转换为: \u0031\u0031 ,这样的编码
调试输出 (格式化字符串 (“\u4f60\u597d\u0021\ubaad\uf00d”, 假, 0))  ' 将格式化字符串编码转回文本
调试输出 (格式化字符串 (“你好!”, 真, 1))  ' 将文本转换为: %u0031%u0031 ,这样的编码
调试输出 (格式化字符串 (“%u4f60%u597d%u0021%ubaad%uf00d”, 假, 1))  ' 将格式化字符串编码转回文本
调试输出 (格式化字符串 (“你好!ABC D”, 真, 2))  ' 将文本转换为: %E4%BD%A0%E5%A5%BD%21ABC%20D ,这样的编码(URL编码)
调试输出 (格式化字符串 (“%E4%BD%A0%E5%A5%BD%21ABC%20D”, 假, 2))  ' 将格式化字符串编码转回文本
标准输入 ()
返回 (0)  ' 可以根据您的需要返回任意数值



i支持库列表   支持库注释   
spec特殊功能支持库
JsonReader(未知支持库)


转换结果:

* 字节集:8{96,79,125,89,33,0,0,0}
* “你好!”
* “浣犲ソ!”
* “你好!”
* “\u4f60\u597d\u0021\ubaad\uf00d”
* “你好!”
* “%u4f60%u597d%u0021%ubaad%uf00d”
* “你好!”
* “%E4%BD%A0%E5%A5%BD%21ABC%20D”
* “你好!ABC D”



=======================================================
支持库下载:
链接: https://pan.baidu.com/s/1slGv1il 密码: mph2




作者: happyweeks365    时间: 2017-5-3 14:21
学西欧。。。。。。。。
作者: 爽歪歪    时间: 2017-5-3 15:55
顶猫哥。
作者: 洋洋188    时间: 2017-5-3 18:34
搞成支持库了
作者: 薄荷旅途    时间: 2017-5-7 16:32
感谢分享,正需要这个。
作者: ωind    时间: 2017-5-18 17:22
顶猫哥。很赞
作者: 小小W    时间: 2017-5-19 09:39
请问 编译之后运行出错是什么情况啊?

1.PNG (22.73 KB, 下载次数: 0)

1.PNG

作者: 夜的静night    时间: 2017-5-22 08:23
很给力。。。
作者: nw828622hr    时间: 2017-5-28 23:34
不知道和什么有冲突,同样的代码  新建E测试加数组对象正常  在我的代码里面跑就没法加数组对象
作者: 海浪人生    时间: 2017-6-27 03:52
很不错的 比其他的一些编码转换的好用


作者: Else    时间: 2017-8-20 21:17
从文件解析,无法判断是否正确,且返回了什么???  易语言5.3
作者: xinqing    时间: 2017-9-1 10:56
这个只能用于控制台,正常程序编译后出问题的路过
作者: 阿轩同学    时间: 2017-9-3 10:28
6666666666666666666666666666666
作者: 浮沉软件    时间: 2017-11-6 21:12
支持!!!!
作者: jnlrs    时间: 2017-11-11 21:13
hhhhhhhh
作者: 鹭岛空军    时间: 2017-12-29 16:31
谢谢了,下载备用!!
作者: 时光飞逝0    时间: 2017-12-29 19:06
谢谢了,下载备用!!
作者: zybzym    时间: 2018-1-3 14:44
下载备用,非常感谢
作者: 浅滩づ晓海    时间: 2018-1-30 20:49
本帖最后由 浅滩づ晓海 于 2018-1-30 20:52 编辑

支持库版本解析速度慢,比类_json还慢,之前的dll版本解析速度快,但是dll版本解析450k文件的文本,解析到241次(每次都是241)时崩溃,死循环解析同一个文件,大概2分钟崩溃吧,是不是dll里面内存没释放?没有细看您的c++代码,是这个函数吗?
void heimao_json_reader_parser_text (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
Json::Reader *pReader=(Json::Reader*)*(DWORD*)pArgInf[0].m_pCompoundData;
LPCSTR szText=pArgInf[1].m_pText;
if(pReader!=NULL && szText[0]!='\0')
{
  DWORD dwAddr=*(DWORD*)pArgInf[2].m_pCompoundData;
  Json::Value *pValue=(Json::Value*)*(DWORD*)dwAddr;
  if(pValue!=NULL)
  {
   delete pValue;
  }
  *(DWORD*)dwAddr=NULL;
  Json::Value *pNewValue=new Json::Value;
  pRetData->m_dtDataType=SDT_BOOL;
  pRetData->m_bool=pReader->parse(szText,(*pNewValue),false);
  if(pRetData->m_bool==FALSE)
  {
   delete pNewValue;
  }
  else
  {
   *(DWORD*)dwAddr=(DWORD)pNewValue;
  }
}
}


作者: 暗夜星辰sky    时间: 2018-3-14 05:15
nw828622hr 发表于 2017-5-28 23:34
不知道和什么有冲突,同样的代码  新建E测试加数组对象正常  在我的代码里面跑就没法加数组对象

遇到同样的问题,测试没问题,放代码就不行了
作者: 暗夜星辰sky    时间: 2018-3-14 05:16
812098008 发表于 2017-5-19 09:39
请问 编译之后运行出错是什么情况啊?

你这是顺序写错了吧
作者: ydlds777    时间: 2018-4-5 20:01
asInt()在调试中正常,编译后都是 1
作者: hsx799    时间: 2018-5-31 20:33
[{"name":"美人鱼","type":"电影","list":{"num":1,"site_list":["qq","youku","pptv"],"site":"iqiyi","item":[{"title":"美人鱼","url":"http://www.iqiyi.com/v_19rrlq5w00.html"}]}},{"name":"美人鱼(2006)","type":"电影","list":{"num":1,"site_list":["qq"],"site":"iqiyi","item":[{"title":"美人鱼(2006)","url":"http://www.iqiyi.com/v_19rrk1877s.html"}]}},{"name":"人鱼校花","type":"电影","list":{"num":1,"site_list":null,"site":"iqiyi","item":[{"title":"人鱼校花","url":"http://www.iqiyi.com/v_19rr9gibj0.html"}]}}]


最外面是数组的怎么写??????????????
作者: 风九幽    时间: 2018-6-3 14:11
遇到同样的问题,测试没问题,放代码就不行了
作者: gclinux    时间: 2018-6-9 08:35
问题来了 不支持静态编译
作者: zyxcba    时间: 2018-6-12 00:06
经常出现内存非法读取啊
作者: bigdragon    时间: 2018-6-16 16:10
给你点赞,今天才发现有这好东西
作者: xiang135666    时间: 2018-6-24 21:05
请教个问题 怎么取解析成员数??
作者: 江户川陈大白    时间: 2018-8-4 00:10
错误(34): 找不到指定的对象成员名称“ASINT”

这可怎么办啊
  1. .版本 2
  2. .支持库 JsonReader

  3. .子程序 解析信息
  4. .局部变量 Reader, Json::Reader, , , JSON解析引擎
  5. .局部变量 Root, Json::Value, , , 根节点对象
  6. .局部变量 Array, Json::Value, , , 数组对象

  7. Reader.从文本解析 (POST (226755921), Root)
  8. .如果真 (Root.At ("level_info").At("current_level").ASINT<2)'等级2以下的账号不参统计算
复制代码


作者: 江户川陈大白    时间: 2018-8-4 00:11
江户川陈大白 发表于 2018-8-4 00:10
错误(34): 找不到指定的对象成员名称“ASINT”

这可怎么办啊

@黑猫よ__ 求解答!
作者: sanwenjing    时间: 2018-9-14 13:34
赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!赞一个,大神啊!
作者: ja2007gg    时间: 2019-1-15 22:01
看帖还收取了我的币
作者: fangmoyan    时间: 2019-11-27 07:03
有BUG 不知道修复没修复!数组内的其它类型数据都会被转化为文本型的数据!
作者: useo    时间: 2019-12-25 21:22
问题来了 不支持静态编译
作者: NewLemon    时间: 2020-3-6 18:04
本帖最后由 NewLemon 于 2020-3-6 18:10 编辑

本帖最后由 NewLemon 于 2020-3-6 18:02 编辑   对于不规正json解析不了 [{"symbol": "1",
"name": "1",
"trade": "1",


},{
"symbol": "1",
"name": "1",
"trade": "1",

},{
"symbol": "1",
"name": "1",
"trade": "1",


}],这样的xx完全解析不了。另外精易模块JSON可以解析,速度相当慢。web客户支持库可以解析,但是获取不到xx。其他JSON都测试全部取货不到

作者: NewLemon    时间: 2020-3-6 18:04
另外从文件解析不了
作者: 十点半之后    时间: 2021-6-3 17:46
无法静态编译,asint有问题
作者: likoosong    时间: 2022-9-29 09:00
path.fne                                          
作者: 5113c    时间: 2023-5-23 16:12
感谢分享
作者: 风华俊杰    时间: 2024-10-14 14:58
感谢分享,非常好用
作者: 叽咕叽咕纳尼    时间: 2024-12-16 20:14
很好用,感谢分享。
作者: wxhpk9999    时间: 2025-2-8 22:20
66666666666666




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