殇·愚 发表于 2019-9-15 02:07:02

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

本帖最后由 殇·愚 于 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 原帖地址 : https://www.autoitscript.com/forum/topic/148114-a-non-strict-json-udf-jsmn/?tab=comments#comment-1051873

现在. 我的问题是.在我那段 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 这样吧... 这问题好像很傻逼..可找了很久帮助文档都没有答案..:face (36):


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

heavenm 发表于 2019-9-15 02:38:46

$jsonFile=FileRead('1.json')
$jsonObject = Json_Decode($jsonFile)
$a=Json_Get($jsonObject,'')
$a=Json_ObjGetKeys($a)
$a=Json_Get($jsonObject,'["'&$a&'"].id')
MsgBox(0, '', $a)

heavenm 发表于 2019-9-15 02:40:53

不知道是不是你要的效果,读不了2004是因为2004要双引号,当做字符串,不能当做数字
我的json也是用这个,你这个json还好,我处理的json里面还有数组什么乱七八糟的要处理,好麻烦!

heavenm 发表于 2019-9-15 02:42:11

Json_Get($jsonObject,'["2004"].id')

heavenm 发表于 2019-9-15 02:49:19

还有弄毛线的二维数组,肯定是写入数据库了,我都是写数据库的,通过json结构,分解到数据库中,不过现在手工拆,不过应该可以做到更高级,直接自动全结构拆解
可能对数据库还不是很了解!

殇·愚 发表于 2019-9-15 03:22:28

heavenm 发表于 2019-9-15 02:42
Json_Get($jsonObject,'["2004"].id')

不是要直接读取 2004 的数据. 而是比如我有10 个数据 . 从 2004 - 20xx , 但我在这个UDF 里找不到能获取对应ID 列表的方式...

殇·愚 发表于 2019-9-15 03:27:17

heavenm 发表于 2019-9-15 02:38


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

有点理解不过来. 可能是不能理解 json_get 和 getkey 里获取的数据是数组或是字段或是 json ?

殇·愚 发表于 2019-9-15 03:36:21

heavenm 发表于 2019-9-15 02:49
还有弄毛线的二维数组,肯定是写入数据库了,我都是写数据库的,通过json结构,分解到数据库中,不过现在手工拆, ...

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

上次研究了一半论坛里的那个增删改查sqlite 的帖子.. 对数据库的命令不熟悉,入门有难度.. 看了教程研究了一半, 最后小数据还是直接用 ini 存储了... :face (2):

殇·愚 发表于 2019-9-15 04:41:23

研究了老半天. 其实困难在于搞不清楚数据格式, 开发者给的演示代码里也没有说明, 有些字段格式或是要求搞不清楚.

绿色风 发表于 2019-9-15 08:50:03

一次搞不出来,就分段好了。反正我是这样玩的。

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

殇·愚 发表于 2019-9-15 11:20:43

绿色风 发表于 2019-9-15 08:50
一次搞不出来,就分段好了。反正我是这样玩的。

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

不是数据搞不出来. 而是没搞懂怎么把 产品列表的 ID 字段全部获取到..

heavenm 发表于 2019-9-15 18:23:24

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

http://www.kjson.com/jsoneditor/
把JSON解析出来,你应该就能看懂了

heavenm 发表于 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,'')
$a=Json_ObjGetKeys($a)
$a=Json_Get($jsonObject,'["'&$a&'"].id')
MsgBox(0, '', $a)
这个就是你需要的功能啊
$a=Json_ObjGetKeys($a)这个是个数组,我只是没给你历遍一次
你自己用数组看看就知道了

殇·愚 发表于 2019-9-16 00:18:48

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

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


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

Json_ObjGet(ByRef $Object, $Key)

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

页: [1]
查看完整版本: 求_json UDF 的功能解释. 研究了好久都没搞懂里面的一些含义.[已解决]