Vba Json

  1. 本帖已被收录到知识树中,索引项: 网页交互
    创建一个“类模块”,命名为“VbaJson”
    然后把下面的代码粘贴进去:



  2. Private Whitespace, NumberRegex, StringChunk
  3. Private b, f, r, n, t

  4. Private Sub Class_Initialize()
  5.     Whitespace = " " & vbTab & vbCr & vbLf
  6.     b = ChrW(8)
  7.     f = vbFormFeed
  8.     r = vbCr
  9.     n = vbLf
  10.     t = vbTab
  11.     Set NumberRegex = New RegExp
  12.     NumberRegex.Pattern = "(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?"
  13.     NumberRegex.Global = False
  14.     NumberRegex.MultiLine = True
  15.     NumberRegex.IgnoreCase = True
  16.     Set StringChunk = New RegExp
  17.     StringChunk.Pattern = "([\s\S]*?)([""\\\x00-\x1f])"
  18.     StringChunk.Global = False
  19.     StringChunk.MultiLine = True
  20.     StringChunk.IgnoreCase = True
  21. End Sub

  22. Public Function encode(ByRef obj)
  23.     Dim buf, i, c, g
  24.     Set buf = CreateObject("Scripting.Dictionary")
  25.     Select Case VarType(obj)
  26.     Case vbNull
  27.         buf.Add buf.Count, "null"
  28.     Case vbBoolean
  29.         If obj Then
  30.             buf.Add buf.Count, "true"
  31.         Else
  32.             buf.Add buf.Count, "false"
  33.         End If
  34.     Case vbInteger, vbLong, vbSingle, vbDouble
  35.         buf.Add buf.Count, obj
  36.     Case vbString
  37.         buf.Add buf.Count, """"
  38.         For i = 1 To Len(obj)
  39.             c = Mid(obj, i, 1)
  40.             Select Case c
  41.             Case """": buf.Add buf.Count, "\"""
  42.             Case "\": buf.Add buf.Count, "\\"
  43.             Case "/": buf.Add buf.Count, "/"
  44.             Case b: buf.Add buf.Count, "\b"
  45.             Case f: buf.Add buf.Count, "\f"
  46.             Case r: buf.Add buf.Count, "\r"
  47.             Case n: buf.Add buf.Count, "\n"
  48.             Case t: buf.Add buf.Count, "\t"
  49.             Case Else
  50.                 If AscW(c) >= 0 And AscW(c) <= 31 Then
  51.                     c = Right("0" & Hex(AscW(c)), 2)
  52.                     buf.Add buf.Count, "\u00" & c
  53.                 Else
  54.                     buf.Add buf.Count, c
  55.                 End If
  56.             End Select
  57.         Next
  58.         buf.Add buf.Count, """"
  59.     Case vbArray + vbVariant
  60.         g = True
  61.         buf.Add buf.Count, "["
  62.         For Each i In obj
  63.             If g Then g = False Else buf.Add buf.Count, ","
  64.             buf.Add buf.Count, encode(i)
  65.         Next
  66.         buf.Add buf.Count, "]"
  67.     Case vbObject
  68.         If TypeName(obj) = "Dictionary" Then
  69.             g = True
  70.             buf.Add buf.Count, "{"
  71.             For Each i In obj
  72.                 If g Then g = False Else buf.Add buf.Count, ","
  73.                 buf.Add buf.Count, """" & i & """" & ":" & encode(obj(i))
  74.             Next
  75.             buf.Add buf.Count, "}"
  76.         Else
  77.             Err.Raise 8732, , "None dictionary object"
  78.         End If
  79.     Case Else
  80.         buf.Add buf.Count, """" & CStr(obj) & """"
  81.     End Select
  82.     encode = Join(buf.Items, "")
  83. End Function

  84. Public Function Decode(ByRef str)
  85.     Dim idx
  86.     idx = SkipWhitespace(str, 1)
  87.     If Mid(str, idx, 1) = "{" Then
  88.         Set Decode = ScanOnce(str, 1)
  89.     Else
  90.         Decode = ScanOnce(str, 1)
  91.     End If
  92. End Function

  93. Private Function ScanOnce(ByRef str, ByRef idx)
  94.     Dim c, ms
  95.     idx = SkipWhitespace(str, idx)
  96.     c = Mid(str, idx, 1)
  97.     If c = "{" Then
  98.         idx = idx + 1
  99.         Set ScanOnce = parseObject(str, idx)
  100.         Exit Function
  101.     ElseIf c = "[" Then
  102.         idx = idx + 1
  103.         ScanOnce = parseArray(str, idx)
  104.         Exit Function
  105.     ElseIf c = """" Then
  106.         idx = idx + 1
  107.         ScanOnce = parseString(str, idx)
  108.         Exit Function
  109.     ElseIf c = "n" And StrComp("null", Mid(str, idx, 4)) = 0 Then
  110.         idx = idx + 4
  111.         ScanOnce = Null
  112.         Exit Function
  113.     ElseIf c = "t" And StrComp("true", Mid(str, idx, 4)) = 0 Then
  114.         idx = idx + 4
  115.         ScanOnce = True
  116.         Exit Function
  117.     ElseIf c = "f" And StrComp("false", Mid(str, idx, 5)) = 0 Then
  118.         idx = idx + 5
  119.         ScanOnce = False
  120.         Exit Function
  121.     End If
  122.     Set ms = NumberRegex.Execute(Mid(str, idx))
  123.     If ms.Count = 1 Then
  124.         idx = idx + ms(0).Length
  125.         ScanOnce = CDbl(ms(0))
  126.         Exit Function
  127.     End If
  128.     Err.Raise 8732, , "No JSON object could be ScanOnced"
  129. End Function

  130. Private Function parseObject(ByRef str, ByRef idx)
  131.     Dim c, key, value
  132.     Set parseObject = CreateObject("Scripting.Dictionary")
  133.     idx = SkipWhitespace(str, idx)
  134.     c = Mid(str, idx, 1)
  135.     If c = "}" Then
  136.         Exit Function
  137.     ElseIf c <> """" Then
  138.         Err.Raise 8732, , "Expecting property name"
  139.     End If
  140.     idx = idx + 1
  141.     Do
  142.         key = parseString(str, idx)
  143.         idx = SkipWhitespace(str, idx)
  144.         If Mid(str, idx, 1) <> ":" Then
  145.             Err.Raise 8732, , "Expecting : delimiter"
  146.         End If
  147.         idx = SkipWhitespace(str, idx + 1)
  148.         If Mid(str, idx, 1) = "{" Then
  149.             Set value = ScanOnce(str, idx)
  150.         Else
  151.             value = ScanOnce(str, idx)
  152.         End If
  153.         parseObject.Add key, value
  154.         idx = SkipWhitespace(str, idx)
  155.         c = Mid(str, idx, 1)
  156.         If c = "}" Then
  157.             Exit Do
  158.         ElseIf c <> "," Then
  159.             Err.Raise 8732, , "Expecting , delimiter"
  160.         End If
  161.         idx = SkipWhitespace(str, idx + 1)
  162.         c = Mid(str, idx, 1)
  163.         If c <> """" Then
  164.             Err.Raise 8732, , "Expecting property name"
  165.         End If
  166.         idx = idx + 1
  167.     Loop
  168.     idx = idx + 1
  169. End Function

  170. Private Function parseArray(ByRef str, ByRef idx)
  171.     Dim c, values, value
  172.     Set values = CreateObject("Scripting.Dictionary")
  173.     idx = SkipWhitespace(str, idx)
  174.     c = Mid(str, idx, 1)
  175.     If c = "]" Then
  176.         parseArray = values.Items
  177.         Exit Function
  178.     End If
  179.     Do
  180.         idx = SkipWhitespace(str, idx)
  181.         If Mid(str, idx, 1) = "{" Then
  182.             Set value = ScanOnce(str, idx)
  183.         Else
  184.             value = ScanOnce(str, idx)
  185.         End If
  186.         values.Add values.Count, value
  187.         idx = SkipWhitespace(str, idx)
  188.         c = Mid(str, idx, 1)
  189.         If c = "]" Then
  190.             Exit Do
  191.         ElseIf c <> "," Then
  192.             Err.Raise 8732, , "Expecting , delimiter"
  193.         End If
  194.         idx = idx + 1
  195.     Loop
  196.     idx = idx + 1
  197.     parseArray = values.Items
  198. End Function

  199. Private Function parseString(ByRef str, ByRef idx)
  200.     Dim chunks, content, terminator, ms, esc, char
  201.     Set chunks = CreateObject("Scripting.Dictionary")
  202.     Do
  203.         Set ms = StringChunk.Execute(Mid(str, idx))
  204.         If ms.Count = 0 Then
  205.             Err.Raise 8732, , "Unterminated string starting"
  206.         End If
  207.         content = ms(0).Submatches(0)
  208.         terminator = ms(0).Submatches(1)
  209.         If Len(content) > 0 Then
  210.             chunks.Add chunks.Count, content
  211.         End If
  212.         idx = idx + ms(0).Length
  213.         If terminator = """" Then
  214.             Exit Do
  215.         ElseIf terminator <> "\" Then
  216.             Err.Raise 8732, , "Invalid control character"
  217.         End If
  218.         esc = Mid(str, idx, 1)
  219.         If esc <> "u" Then
  220.             Select Case esc
  221.             Case """": char = """"
  222.             Case "\": char = "\"
  223.             Case "/": char = "/"
  224.             Case "b": char = b
  225.             Case "f": char = f
  226.             Case "n": char = n
  227.             Case "r": char = r
  228.             Case "t": char = t
  229.             Case Else: Err.Raise 8732, , "Invalid escape"
  230.             End Select
  231.             idx = idx + 1
  232.         Else
  233. : char = ChrW("&H" & Mid(str, idx + 1, 4))
  234.             idx = idx + 5
  235.         End If
  236.         chunks.Add chunks.Count, char
  237.     Loop
  238.     parseString = Join(chunks.Items, "")
  239. End Function

  240. Private Function SkipWhitespace(ByRef str, ByVal idx)
  241.     Do While idx <= Len(str) And _
  242.        InStr(Whitespace, Mid(str, idx, 1)) > 0
  243.         idx = idx + 1
  244.     Loop
  245.     SkipWhitespace = idx
  246. End Function

  247. Function ParseJson(strJson)
  248.     Set HTML = CreateObject("htmlfile")
  249.     Set Window = HTML.parentWindow
  250.     Window.execScript "var json = " & strJson, "JScript"
  251.     Set ParseJson = Window.json
  252. End Function
复制代码

然后,用下面的代码测试:

  1. Private Sub CommandButton1_Click()    '时时彩
  2.     Dim tt As String
  3.     Columns("B:B").NumberFormatLocal = "@"
  4.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  5.         .Open "GET", "http://baidu.lecai.com/lottery/draw/view/200", False
  6.         .send
  7.         tt = Split(Split(Replace(.responseText, "[]", """"""), "var phaseData = ")(1), ";")(0)
  8.         With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
  9.             .SetText tt
  10.             .PutInClipboard
  11.         End With
  12.         '读取json开始
  13.         Dim json
  14.         Set json = New VbaJson
  15.         Set r = json.Decode(tt)
  16.         i = 0
  17.         For Each v In r
  18.             For Each s In r(v)
  19.                 t = ""
  20.                 For Each u In r(v)(s)("result")("red")
  21.                     t = t & u
  22.                 Next
  23.                 i = i + 1
  24.                 Cells(i, 1) = s
  25.                 Cells(i, 2) = t
  26.                 Cells(i, 3) = r(v)(s)("open_time")
  27.             Next
  28.         Next
  29.         Set json = Nothing
  30.         '读取json结束
  31.     End With
  32. End Sub
复制代码
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值