找回密码
 加入
搜索
查看: 3005|回复: 13

[AU3基础] 求_json UDF 的功能解释. 研究了好久都没搞懂里面的一些含义.[已解决]

[复制链接]
发表于 2019-9-15 02:07:02 | 显示全部楼层 |阅读模式
本帖最后由 殇·愚 于 2019-9-16 00:22 编辑

最近在做一个对接API 接口的客户端, 需要解析API 下发的 json 格式数据.
先上一段获取到的API 数据:

{
    "info": {
        "page_rs": {
            "entitle": "Products",
            "banner": false,
            "id": "45",
            "parent_id": "0",
            "site_id": "1",
            "module": "24",
            "cate": "70",
            "title": "产品展示",
            "nick_title": "",
            "taxis": "50",
            "status": "1",
            "tpl_index": "",
            "tpl_list": "",
            "tpl_content": "",
            "is_identifier": "0",
            "ico": "images/ico/product.png",
            "orderby": "l.sort DESC,l.dateline DESC,l.id DESC",
            "alias_title": "产品名称",
            "alias_note": "",
            "psize": "12",
            "uid": "0",
            "identifier": "product",
            "seo_title": "",
            "seo_keywords": "",
            "seo_desc": "",
            "subtopics": "0",
            "is_search": "1",
            "is_tag": "1",
            "is_biz": "1",
            "is_userid": "0",
            "is_tpl_content": "0",
            "is_seo": "0",
            "currency_id": "1",
            "admin_note": "",
            "hidden": "0",
            "post_status": "0",
            "comment_status": "1",
            "post_tpl": "",
            "etpl_admin": "",
            "etpl_user": "",
            "etpl_comment_admin": "",
            "etpl_comment_user": "",
            "is_attr": "1",
            "tag": false,
            "cate_multiple": "0",
            "biz_attr": "1",
            "freight": "1",
            "list_fields": "",
            "style": "",
            "is_front": "0",
            "is_api": "1",
            "url": "https://www.xxxxxx.com/index.php?id=product"
        },
        "m_rs": {
            "id": "24",
            "title": "产品",
            "status": "1",
            "taxis": "40",
            "note": "适用于电子商务中产品展示模型",
            "layout": "hits,dateline,sort,thumb",
            "mtype": "0",
            "tbl": "list"
        },
        "cate_root": {
            "id": "70",
            "site_id": "1",
            "parent_id": "0",
            "status": "1",
            "title": "产品分类",
            "taxis": "20",
            "tpl_list": "",
            "tpl_content": "",
            "psize": "0",
            "seo_title": "",
            "seo_keywords": "",
            "seo_desc": "",
            "identifier": "chanpinfenlei",
            "tag": "",
            "style": "",
            "module_id": "0",
            "url": "https://www.xxxxxx.com/index.php?id=product&cate=chanpinfenlei"
        },
        "pageid": "1",
        "psize": "12",
        "pageurl": "https://www.xxxxxx.com/api.php?id=product",
        "total": "1",
        "rslist": {
            "2004": {
                "id": "2004",
                "parent_id": "0",
                "cate_id": "582",
                "module_id": "24",
                "project_id": "45",
                "site_id": "1",
                "title": "测试品",
                "dateline": "1567924670",
                "sort": "0",
                "status": "1",
                "hidden": "0",
                "hits": "51",
                "tpl": "",
                "seo_title": "",
                "seo_keywords": "",
                "seo_desc": "",
                "tag": "",
                "attr": "h,c,f",
                "replydate": "0",
                "user_id": "0",
                "identifier": "",
                "integral": "0",
                "style": "",
                "thumb": {
                    "id": "1403",
                    "cate_id": "1",
                    "folder": "res/201909/05/",
                    "name": "7fac75d1242a7ac5.jpg",
                    "ext": "jpg",
                    "filename": "res/201909/05/7fac75d1242a7ac5.jpg",
                    "ico": "res/_cache/_ico/14/1403.jpg",
                    "addtime": "1567668035",
                    "title": "460x0w",
                    "attr": {
                        "width": 460,
                        "height": 460
                    },
                    "note": "",
                    "session_id": "",
                    "user_id": "0",
                    "download": "0",
                    "admin_id": "1",
                    "mime_type": "image/jpeg",
                    "gd": {
                        "auto": "res/_cache/auto/14/1403.jpg",
                        "thumb": "res/_cache/thumb/14/1403.jpg"
                    }
                },
                "pictures": false,
                "linkurl": "index.php?id=about",
                "content": "<p>测试=125</p><p>拜托=145</p>",
                "price": "10.0000",
                "currency_id": "1",
                "weight": "0",
                "volume": "0",
                "unit": "个",
                "catelist": {
                    "582": {
                        "cate_id": "582",
                        "title": "小米",
                        "identifier": "xiaomi",
                        "url": "https://www.xxxxxx.com/api.php?id=product&cate=xiaomi"
                    }
                },
                "cate": {
                    "cate_id": "582",
                    "title": "小米",
                    "identifier": "xiaomi",
                    "url": "https://www.xxxxxx.com/api.php?id=product&cate=xiaomi"
                },
                "url": "https://www.xxxxxx.com/index.php?id=2004"
            }
        }
    },
    "status": 1,
    "session_name": "PHPSESSION",
    "session_val": "********************************"
}

再上 _json 的 UDF 文件, 我自己标注了备注.但好像理解有点问题. 或者没法解释清楚对应的功能.  导致没法正确使用. 这个是国外 AUTOIT 论坛里找到最完善的 json UDF , 但有些地方看不懂, 也没法把所有的数据变成对应的数组.. 尴尬...
; ============================================================================================================================
; File                : Json.au3 (2018.12.29)
; Purpose        : A Non-Strict JavaScript Object Notation (JSON) Parser UDF
; Author        : Ward
; Dependency: BinaryCall.au3
; Website        : http://www.json.org/index.html
;
; Source        : jsmn.c
; Author        : zserge
; Website        : http://zserge.com/jsmn.html
;
; Source        : json_string_encode.c, json_string_decode.c
; Author        : Ward
;             Jos - Added Json_Dump()
;             TheXMan - Json_ObjGetItems and some Json_Dump Fixes.
;             Jos - Changed Json_ObjGet() and Json_ObjExists() to allow for multilevel object in string.
; ============================================================================================================================
#cs 这段说明里的中文备注是我自己写的
        ; ============================================================================================================================
        ; Public Functions:
        ;   Json_StringEncode($String, $Option = 0)
        json 字符串编码 , 转换中文为 Unicode 格式
        ;   Json_StringDecode($String)
        获取到的 json 字符串解码为中文格式.
        ;   Json_IsObject(ByRef $Object)
        检测变量是否是json
        ;   Json_IsNull(ByRef $Null)
        检测变量是否为空
        ;   Json_Encode($Data, $Option = 0, $Indent = Default, $ArraySep = Default, $ObjectSep = Default, $ColonSep = Default)
        中文转编码为 Unicode 格式. 可以设置编码参数
        ;   Json_Decode($Json, $InitTokenCount = 1000)
        字段内容解码
        ;   Json_ObjCreate()
        创建json 变量
        ;   Json_ObjPut(ByRef $Object, $Key, $Value)
        写入指定键值的数据
        ;   Json_ObjGet(ByRef $Object, $Key)
        获取指定键值的数据
        ;   Json_ObjDelete(ByRef $Object, $Key)
        删除json 键名
        ;   Json_ObjExists(ByRef $Object, $Key)
        检测 json 的键值是否存在
        ;   Json_ObjGetCount(ByRef $Object)
        获取 json 的 总数量
        ;   Json_ObjGetKeys(ByRef $Object)
        获取 json 的 键名
        ;   Json_ObjGetItems(ByRef $Object)
        获取 json 的 值
        ;   Json_ObjClear(ByRef $Object)
        清空 json 的数据
        ;   Json_Put(ByRef $Var, $Notation, $Data, $CheckExists = False)
        提交新的数据到  json 里.
        ;   Json_Get(ByRef $Var, $Notation)
        获取 json 转储后的键值 对应的数据. 可以是 字段 或 数组.
        $Json = '{"info":{"id":"23","group_id":"2","user":"admin","status":"1","regtime":"1438668082","email":"40782502@qq.com","mobile":"15818533979","code":"","avatar":"res/201907/19/782f85730e9c7fdf.jpg","fullname":"苏相锟","gender":"0","pca":{"title":["广东省","深圳市","龙华区"],"val":["广东省","深圳市","龙华区"],"type":"opt"},"address":"","wealth":{"integral":{"id":"1","title":"积分","val":3297,"unit":"点"},"wallet":{"id":"2","title":"钱包","val":"0.00","unit":"元"},"redbao":{"id":"5","title":"红包","val":"0.00","unit":"个"}}},"status":1,"session_name":"PHPSESSION","session_val":"********************************"}'
        Json_dump($Json)
        Local $Obj = JSon_Decode($Json)
        _ArrayDisplay( Json_ObjGet( $Obj , ".info.pca.title" ) )

        ;   Json_Dump($String)
        JSON 获取后需要转储成为可以查询的KEY .

$Var 代表json 变量 , $Notation 为 Json_Dump 后的KEY .
        ; ============================================================================================================================
#ce


为了帖子方便观看. 我已经删除 UDF 的内容, 想要的可以下载附件哈. 或者到作者原帖查看下载.
UDF 原帖地址 : [url]https://www.autoitscript.com/forum/topic/148114-a-non-strict-json-udf-jsmn/?tab=comments#comment-1051873[/url]

现在. 我的问题是.  在我那段 json 里,  包含了 分类信息 字段 , 以及所属项目 信息字段 , 最后还有 分类里的数据列表字段. 就是带有编号 的数据.

"rslist": {
            "2004": {
                "id": "2004",

我通过 _json_dump() 命令可以看到以下输出

+-> .info.page_rs.entitle  =Products
+-> .info.page_rs.banner  =False
+-> .info.page_rs.id  =45
+-> .info.page_rs.parent_id  =0
+-> .info.page_rs.site_id  =1
+-> .info.page_rs.module  =24
+-> .info.page_rs.cate  =70
+-> .info.page_rs.title  =产品展示
+-> .info.page_rs.nick_title  =
+-> .info.page_rs.taxis  =50
+-> .info.page_rs.status  =1
+-> .info.page_rs.tpl_index  =
+-> .info.page_rs.tpl_list  =
+-> .info.page_rs.tpl_content  =
+-> .info.page_rs.is_identifier  =0
+-> .info.page_rs.ico  =images/ico/product.png
+-> .info.page_rs.orderby  =l.sort DESC,l.dateline DESC,l.id DESC
+-> .info.page_rs.alias_title  =产品名称
+-> .info.page_rs.alias_note  =
+-> .info.page_rs.psize  =12
+-> .info.page_rs.uid  =0
+-> .info.page_rs.identifier  =product
+-> .info.page_rs.seo_title  =
+-> .info.page_rs.seo_keywords  =
+-> .info.page_rs.seo_desc  =
+-> .info.page_rs.subtopics  =0
+-> .info.page_rs.is_search  =1
+-> .info.page_rs.is_tag  =1
+-> .info.page_rs.is_biz  =1
+-> .info.page_rs.is_userid  =0
+-> .info.page_rs.is_tpl_content  =0
+-> .info.page_rs.is_seo  =0
+-> .info.page_rs.currency_id  =1
+-> .info.page_rs.admin_note  =
+-> .info.page_rs.hidden  =0
+-> .info.page_rs.post_status  =0
+-> .info.page_rs.comment_status  =1
+-> .info.page_rs.post_tpl  =
+-> .info.page_rs.etpl_admin  =
+-> .info.page_rs.etpl_user  =
+-> .info.page_rs.etpl_comment_admin  =
+-> .info.page_rs.etpl_comment_user  =
+-> .info.page_rs.is_attr  =1
+-> .info.page_rs.tag  =False
+-> .info.page_rs.cate_multiple  =0
+-> .info.page_rs.biz_attr  =1
+-> .info.page_rs.freight  =1
+-> .info.page_rs.list_fields  =
+-> .info.page_rs.style  =
+-> .info.page_rs.is_front  =0
+-> .info.page_rs.is_api  =1
+-> .info.page_rs.url  =https://www.xxxxxx.com/index.php?id=product
+-> .info.m_rs.id  =24
+-> .info.m_rs.title  =产品
+-> .info.m_rs.status  =1
+-> .info.m_rs.taxis  =40
+-> .info.m_rs.note  =适用于电子商务中产品展示模型
+-> .info.m_rs.layout  =hits,dateline,sort,thumb
+-> .info.m_rs.mtype  =0
+-> .info.m_rs.tbl  =list
+-> .info.cate_root.id  =70
+-> .info.cate_root.site_id  =1
+-> .info.cate_root.parent_id  =0
+-> .info.cate_root.status  =1
+-> .info.cate_root.title  =产品分类
+-> .info.cate_root.taxis  =20
+-> .info.cate_root.tpl_list  =
+-> .info.cate_root.tpl_content  =
+-> .info.cate_root.psize  =0
+-> .info.cate_root.seo_title  =
+-> .info.cate_root.seo_keywords  =
+-> .info.cate_root.seo_desc  =
+-> .info.cate_root.identifier  =chanpinfenlei
+-> .info.cate_root.tag  =
+-> .info.cate_root.style  =
+-> .info.cate_root.module_id  =0
+-> .info.cate_root.url  =https://www.xxxxxx.com/index.php?id=product&cate=chanpinfenlei
+-> .info.pageid  =1
+-> .info.psize  =12
+-> .info.pageurl  =https://www.xxxxxx.com/api.php?id=product
+-> .info.total  =1
+-> .info.rslist.2004.id  =2004
+-> .info.rslist.2004.parent_id  =0
+-> .info.rslist.2004.cate_id  =582
+-> .info.rslist.2004.module_id  =24
+-> .info.rslist.2004.project_id  =45
+-> .info.rslist.2004.site_id  =1
+-> .info.rslist.2004.title  =测试品
+-> .info.rslist.2004.dateline  =1567924670
+-> .info.rslist.2004.sort  =0
+-> .info.rslist.2004.status  =1
????????????????+-> .info.rslist.2004.hidden  =0
+-> .info.rslist.2004.hits  =51
+-> .info.rslist.2004.tpl  =
+-> .info.rslist.2004.seo_title  =
+-> .info.rslist.2004.seo_keywords  =
+-> .info.rslist.2004.seo_desc  =
+-> .info.rslist.2004.tag  =
+-> .info.rslist.2004.attr  =h,c,f
+-> .info.rslist.2004.replydate  =0
+-> .info.rslist.2004.user_id  =0
+-> .info.rslist.2004.identifier  =
+-> .info.rslist.2004.integral  =0
+-> .info.rslist.2004.style  =
+-> .info.rslist.2004.thumb.id  =1403
+-> .info.rslist.2004.thumb.cate_id  =1
+-> .info.rslist.2004.thumb.folder  =res/201909/05/
+-> .info.rslist.2004.thumb.name  =7fac75d1242a7ac5.jpg
+-> .info.rslist.2004.thumb.ext  =jpg
+-> .info.rslist.2004.thumb.filename  =res/201909/05/7fac75d1242a7ac5.jpg
+-> .info.rslist.2004.thumb.ico  =res/_cache/_ico/14/1403.jpg
+-> .info.rslist.2004.thumb.addtime  =1567668035
+-> .info.rslist.2004.thumb.title  =460x0w
+-> .info.rslist.2004.thumb.attr.width  =460
+-> .info.rslist.2004.thumb.attr.height  =460
+-> .info.rslist.2004.thumb.note  =
+-> .info.rslist.2004.thumb.session_id  =
+-> .info.rslist.2004.thumb.user_id  =0
+-> .info.rslist.2004.thumb.download  =0
+-> .info.rslist.2004.thumb.admin_id  =1
+-> .info.rslist.2004.thumb.mime_type  =image/jpeg
+-> .info.rslist.2004.thumb.gd.auto  =res/_cache/auto/14/1403.jpg
+-> .info.rslist.2004.thumb.gd.thumb  =res/_cache/thumb/14/1403.jpg
+-> .info.rslist.2004.pictures  =False
+-> .info.rslist.2004.linkurl  =index.php?id=about
+-> .info.rslist.2004.content  =<p>测试=125</p><p>拜托=145</p>
+-> .info.rslist.2004.price  =10.0000
+-> .info.rslist.2004.currency_id  =1
+-> .info.rslist.2004.weight  =0
+-> .info.rslist.2004.volume  =0
+-> .info.rslist.2004.unit  =个
+-> .info.rslist.2004.catelist.582.cate_id  =582
+-> .info.rslist.2004.catelist.582.title  =小米
+-> .info.rslist.2004.catelist.582.identifier  =xiaomi
+-> .info.rslist.2004.catelist.582.url  =https://www.xxxxxx.com/api.php?id=product&cate=xiaomi
+-> .info.rslist.2004.cate.cate_id  =582
+-> .info.rslist.2004.cate.title  =小米
+-> .info.rslist.2004.cate.identifier  =xiaomi
+-> .info.rslist.2004.cate.url  =https://www.xxxxxx.com/api.php?id=product&cate=xiaomi
+-> .info.rslist.2004.url  =https://www.xxxxxx.com/index.php?id=2004
+-> .status  =1
+-> .session_name  =PHPSESSION
+-> .session_val  =********************************

前面的字段前缀是固定的. 例如 .info.page_rs.id  之类的  我可以直接通过 _json_get() 获取到对应的数据.

但后面涉及到某个产品所属的ID : 2004  时 .   .info.rslist.2004.id  =2004  里 前面的 2004 没有其他地方可以获取到..

要如何才能先获取到 2004  这个数值. 我才能把列表数据读取出来.  或者这个UDF 里是否有生成数组的功能, 我可以通过数组读取.

我是有考虑修改这个UDF , 在里面遍历数据时增加一个写入数组的操作. 但一方面不清楚本身UDF 有没有这个功能. 研究了好几天源码一直没有完全看懂.  另一方面好像也

另外问个很基础的问题.. 如何才能建立一个没有限制的2D数组变量.  因为我不知道每次获取的json 里有多少的数组.  总不能 设置  $var[9999][999] 这样吧... 这问题好像很傻逼..可找了很久帮助文档都没有答案..  


附件里我把从论坛那边下载的 _json 也上传了.  希望有兴趣的朋友可以一起把这个UDF 功能研究清楚, 一起完善起来, 做一个中文版本的说明.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2019-9-15 02:38:46 | 显示全部楼层
$jsonFile=FileRead('1.json')
$jsonObject = Json_Decode($jsonFile)
$a=Json_Get($jsonObject,'[info][rslist]')
$a=Json_ObjGetKeys($a)
$a=Json_Get($jsonObject,'[info][rslist]["'&$a[0]&'"].id')
MsgBox(0, '', $a)
发表于 2019-9-15 02:40:53 | 显示全部楼层
不知道是不是你要的效果,读不了2004是因为2004要双引号,当做字符串,不能当做数字
我的json也是用这个,你这个json还好,我处理的json里面还有数组什么乱七八糟的要处理,好麻烦!
发表于 2019-9-15 02:42:11 | 显示全部楼层
Json_Get($jsonObject,'[info][rslist]["2004"].id')
发表于 2019-9-15 02:49:19 | 显示全部楼层
还有弄毛线的二维数组,肯定是写入数据库了,我都是写数据库的,通过json结构,分解到数据库中,不过现在手工拆,不过应该可以做到更高级,直接自动全结构拆解
可能对数据库还不是很了解!
 楼主| 发表于 2019-9-15 03:22:28 | 显示全部楼层
heavenm 发表于 2019-9-15 02:42
Json_Get($jsonObject,'[rslist]["2004"].id')

不是要直接读取 2004 的数据. 而是比如我有10 个数据 . 从 2004 - 20xx , 但我在这个UDF 里找不到能获取对应ID 列表的方式...
 楼主| 发表于 2019-9-15 03:27:17 | 显示全部楼层

Json_Decode 我理解是要解码为中文. 是不是这个意思?
然后 Json_Get($jsonObject,'[info][rslist]')  是从字段里获取 数组 ?
再用 Json_ObjGetKeys($a) 获取所有的字段的值 ?
Json_Get($jsonObject,'[info][rslist]["'&$a[0]&'"].id')  获取指定字段的值 ??

有点理解不过来. 可能是不能理解 json_get 和 getkey 里获取的数据是数组或是字段或是 json ?
 楼主| 发表于 2019-9-15 03:36:21 | 显示全部楼层
heavenm 发表于 2019-9-15 02:49
还有弄毛线的二维数组,肯定是写入数据库了,我都是写数据库的,通过json结构,分解到数据库中,不过现在手工拆, ...

我用API 就是实时获取数据. 不过你说的数据库也有道理. 但得每次更新. 还有一点. 我还不会用 sqlite

上次研究了一半论坛里的那个增删改查sqlite 的帖子.. 对数据库的命令不熟悉,入门有难度.. 看了教程研究了一半, 最后小数据还是直接用 ini 存储了...
 楼主| 发表于 2019-9-15 04:41:23 | 显示全部楼层
研究了老半天. 其实困难在于搞不清楚数据格式, 开发者给的演示代码里也没有说明, 有些字段格式或是要求搞不清楚.  
发表于 2019-9-15 08:50:03 | 显示全部楼层
一次搞不出来,就分段好了。反正我是这样玩的。

现在电脑 那么快,不怕影响速度
 楼主| 发表于 2019-9-15 11:20:43 | 显示全部楼层
绿色风 发表于 2019-9-15 08:50
一次搞不出来,就分段好了。反正我是这样玩的。

现在电脑 那么快,不怕影响速度

不是数据搞不出来. 而是没搞懂怎么把 产品列表  的 ID 字段全部获取到..
发表于 2019-9-15 18:23:24 | 显示全部楼层
殇·愚 发表于 2019-9-15 11:20
不是数据搞不出来. 而是没搞懂怎么把 产品列表  的 ID 字段全部获取到..

http://www.kjson.com/jsoneditor/
把JSON解析出来,你应该就能看懂了
发表于 2019-9-15 18:25:14 | 显示全部楼层
殇·愚 发表于 2019-9-15 03:22
不是要直接读取 2004 的数据. 而是比如我有10 个数据 . 从 2004 - 20xx , 但我在这个UDF 里找不到能获取 ...
$jsonFile=FileRead('1.json')
$jsonObject = Json_Decode($jsonFile)
$a=Json_Get($jsonObject,'[info][rslist]')
$a=Json_ObjGetKeys($a)
$a=Json_Get($jsonObject,'[info][rslist]["'&$a[0]&'"].id')
MsgBox(0, '', $a)
这个就是你需要的功能啊
$a=Json_ObjGetKeys($a)这个是个数组,我只是没给你历遍一次
你自己用数组看看就知道了

评分

参与人数 1金钱 +30 收起 理由
殇·愚 + 30 很给力! 明白了.非常感谢

查看全部评分

 楼主| 发表于 2019-9-16 00:18:48 | 显示全部楼层
heavenm 发表于 2019-9-15 18:25
这个就是你需要的功能啊
$a=Json_ObjGetKeys($a)这个是个数组,我只是没给你历遍一次
你自己用数组看 ...

终于明白了. JSON_GET 的参数里,  KEY 的格式就是  [info]  以中括号 指定json 字段的名称,  再用 Json_ObjGetKeys  获取该字段下的所有 key 的一维数组. 如图


然后多级以多个 [][] 表示

  Json_ObjGet(ByRef $Object, $Key)

$Object 表示 json 数据.
$Key 为指定字段的名称, 用 [] 表示.  这样我就明白了. 以此类推应该可以完成整个 JSON 数据的解析了.. 非常感谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 04:17 , Processed in 0.083491 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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