ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3216|回复: 10

[求助] VBA递归解析JSON

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-5-30 10:37 | 显示全部楼层 |阅读模式
Option Explicit
Public Function Get_JSON()
    Dim ht As Object
    Dim arrkeys() As Integer
    Set ht = CreateObject("MSXML2.XMLHTTP")
    Dim url As String
    url = "https://api.apiopen.top/getImages"
    ht.Open "GET", url, False
    ht.send
    Do While ht.readyState <> 4
        DoEvents
    Loop
    Get_JSON = ht.responsetext
End Function
Public Sub JSON_Analysis1()
    '初步设想通过递归遍历完成解析
    Dim strJSON As String
    strJSON = Get_JSON()
    Call Recursion_JScriptTypeInfo(strJSON)
End Sub
Sub Recursion_JScriptTypeInfo(strJSON As String)
    Dim objJSON As Object
    Dim arrkeys() As String
    Dim j As Integer, k
    Dim strJSCode As String
    Dim objkeys As Object
    Dim intKeyLen As Integer
    strJSCode = "function JSGetValue(jsonObj,strKey){return jsonObj[strKey];}"
    strJSCode = strJSCode & " function JSGetKeys(jsonObj){var keys=new Array();for(var key in jsonObj){keys.push(key);}return keys;} "
    With CreateObject("MSScriptControl.ScriptControl")
        .Language = "javascript"
        .AddCode strJSCode
        Set objJSON = .eval("(" + strJSON + ")")
        Set objkeys = .Run("JSGetKeys", objJSON)    '(code, message, result)
        intKeyLen = .Run("JSGetValue", objkeys, "length")
        ReDim arrkeys(intKeyLen - 1)
        j = 0
        For Each k In objkeys
            arrkeys(j) = k
            j = j + 1
        Next
        For Each k In arrkeys
            Debug.Print Trim(k)
            If TypeName(.Run("JSGetValue", objJSON, k)) <> "JScriptTypeInfo" Then
                Debug.Print Trim(.Run("JSGetValue", objJSON, k))
            Else
                strJSON = .Run("JSGetValue", objJSON, k)
                Call Recursion_JScriptTypeInfo(strJSON)
            End If
        Next
    End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-5-30 10:46 | 显示全部楼层
各位大佬,我是一名初学者,想实现递归解析JSON,但是运行会报错“缺少‘]’”,不知道问题出在哪,希望各位能给点帮助。

TA的精华主题

TA的得分主题

发表于 2019-5-30 12:32 | 显示全部楼层
可以借鉴别人的代码 ,看看下面的帖子
JSON解析原理及代码
http://www.json.org/json-zh.html
代码:http://www.ediy.co.nz/vbjson-jso ... -vb6-xidc55680.html

《纯vba代码解析json格式数据》
http://club.excelhome.net/thread-1448414-1-1.html

《网页数据采集---网页文档解析篇(json/html/xml) 》
http://club.excelhome.net/thread-1303169-1-1.html

《【网页采集教程】【高级篇】第二课-使用VBA解析JSON格式的网页 》
http://club.excelhome.net/thread-939881-1-1.html

。。。。。。。

实在太多了,举例都举不过来了。
对了,还有我的JSON类,也是纯代码解析,不过我发布的是最初的试验版,除了不带数组解析,可以实现生成与解析。同一帖子中还有一个利用这个类写的JSON数据查看工具。


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-5-30 14:59 | 显示全部楼层
vbexcelhome 发表于 2019-5-30 12:32
可以借鉴别人的代码 ,看看下面的帖子
JSON解析原理及代码
http://www.json.org/json-zh.html

嗯  好的  谢谢  我先看看

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-5-30 15:43 | 显示全部楼层
上面的问题没解决,但是让我找到另一种方法实现递归...也算曲线救国?
Sub 字典解析JSON()
    Dim jsonStr As String
    jsonStr = Get_JSON()
    Dim jsonObject As New JSON
    Set dict = jsonObject.parse(jsonStr)
    Call Recursion_Collection(dict)
End Sub
Public Function Get_JSON()
    Dim ht As Object
    Dim arrkeys() As Integer
    Set ht = CreateObject("MSXML2.XMLHTTP")
    Dim url As String
    url = "https://api.apiopen.top/getImages"
    ht.Open "GET", url, False
    ht.send
    Do While ht.readyState <> 4
        DoEvents
    Loop
    Get_JSON = ht.ResponseText
End Function
Sub Recursion_Collection(dict)
    For Each s_key In dict.keys()
        If TypeName(dict(s_key)) <> "Collection" Then
            Debug.Print s_key & ":" & dict(s_key)
        Else
            Set res_coll = dict(s_key)
            Dim i As Integer
            For i = 1 To res_coll.Count()
                Set dict = res_coll(i)
                Call Recursion_Collection(dict)
            Next
        End If
    Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-5-30 15:48 | 显示全部楼层
上面的问题没解决,但是让我换了一种方法实现了。。。
Sub 字典解析JSON()
    Dim jsonStr As String
    jsonStr = Get_JSON()
    Dim jsonObject As New JSON
    Set dict = jsonObject.parse(jsonStr)
    Call Recursion_Collection(dict)
End Sub
Public Function Get_JSON()
    Dim ht As Object
    Dim arrkeys() As Integer
    Set ht = CreateObject("MSXML2.XMLHTTP")
    Dim url As String
    url = "https://api.apiopen.top/getImages"
    ht.Open "GET", url, False
    ht.send
    Do While ht.readyState <> 4
        DoEvents
    Loop
    Get_JSON = ht.ResponseText
End Function
Sub Recursion_Collection(dict)
    For Each s_key In dict.keys()
        If TypeName(dict(s_key)) <> "Collection" Then
            Debug.Print s_key & ":" & dict(s_key)
        Else
            Set res_coll = dict(s_key)
            Dim i As Integer
            For i = 1 To res_coll.Count()
                Set dict = res_coll(i)
                Call Recursion_Collection(dict)
            Next
        End If
    Next
End Sub

TA的精华主题

TA的得分主题

发表于 2019-5-30 23:26 | 显示全部楼层
tokido 发表于 2019-5-30 15:48
上面的问题没解决,但是让我换了一种方法实现了。。。
Sub 字典解析JSON()
    Dim jsonStr As String

如果碰到JSON数据,可以先粘贴到软件中看看。下面这个数据是论坛一个网友需要的摹课数据,挺好的数据,正是数组里面再嵌套数组的例子。
自己写的解析类完全没有问题。我又根据这个数据增加了一个函数,调用数据更简单、方便。自己写代码解析优点就是方便。

jsonView2.rar (47.73 KB, 下载次数: 8)
捕获.JPG


解析摹课JSON数据所用的代码(最下面的那个)

TA的精华主题

TA的得分主题

发表于 2019-5-31 00:19 | 显示全部楼层
一般来说,vba解析json的最省事办法是调用htmlfile

TA的精华主题

TA的得分主题

发表于 2019-5-31 07:48 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-5-31 08:56 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 18:07 , Processed in 0.039555 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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