Excel 用VBA解析Json数组
我从一个api得到一个json响应,并解析它以在excel中更新。下面是代码。我无法进一步解析以获取价格信息Excel 用VBA解析Json数组,excel,vba,macos,Excel,Vba,Macos,我从一个api得到一个json响应,并解析它以在excel中更新。下面是代码。我无法进一步解析以获取价格信息 Dim strResult As String Dim objHTTP As Object Dim URL As String Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") URL = "https://bitbns.com/order/getTickerAll" objHTTP.Open "GET", URL, Fal
Dim strResult As String
Dim objHTTP As Object
Dim URL As String
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "https://bitbns.com/order/getTickerAll"
objHTTP.Open "GET", URL, False
objHTTP.Send
Set JSON = JsonConverter.ParseJson(objHTTP.ResponseText)
'strResult = objHTTP.ResponseText
'MsgBox JSON(1)("BTC")("sellPrice")
baseCol = 9
buyCol = 10
sellCol = 11
i = 1
Dim keyCurr As String
For Each Item In JSON
ActiveSheet.Cells(i + 2, baseCol).Value = Item.Keys
i = i + 1
Next
我很乐意帮忙。正如您在上面的评论中所看到的,我能够获得硬编码的数据
MsgBox JSON(1)("BTC")("sellPrice")
但当我试着让它进入循环时,我无法做到。下面是我试过但没用的
ActiveSheet.Cells(i + 2, baseCol).Value = JSON(i)(Item.Keys)("sellPrice")
ActiveSheet.Cells(i + 2, baseCol).Value = JSON(i)(" + Item.Keys + ")("sellPrice")
ActiveSheet.Cells(i + 2, baseCol).Value = JSON(i)(Item(0))("sellPrice")
ActiveSheet.Cells(i + 2, baseCol).Value = JSON(i)(Item(1))("sellPrice")
为了解析JSON,我使用库。它似乎返回了正确的对象(可以看出我能够以硬编码的方式访问,但无法在循环中访问)
更新:根据Vityta的提示,下面的代码似乎工作正常。谢谢你们所有人的及时帮助。:)
如果您对“sellPrice”进行硬编码,您可以得出如下结论:
Dim something, someItem, cnt&
For Each something In JSON
For Each someItem In something
cnt = cnt + 1
Debug.Print someItem
Debug.Print JSON(cnt)(someItem)("sellPrice")
Next someItem
Next something
在即时窗口中:
BTC
623900
XRP
70,35
NEO
7699,5
GAS
2848,97
ETH
59500
XLM
28,38
BTC
sellPrice
625000
buyPrice
624000
lastTradePrice
625000
XRP
sellPrice
70,2
buyPrice
70,1
lastTradePrice
70,2
密钥和项是集合,可通过以下循环:
Dim something, someItem, cnt&, obj, iO
For Each something In JSON
For Each someItem In something
cnt = cnt + 1
Debug.Print someItem
Set obj = JSON(cnt)(someItem)
For Each iO In obj.Keys
Debug.Print iO
Debug.Print obj.item(iO)
Next iO
Next someItem
Next something
在即时窗口中:
BTC
623900
XRP
70,35
NEO
7699,5
GAS
2848,97
ETH
59500
XLM
28,38
BTC
sellPrice
625000
buyPrice
624000
lastTradePrice
625000
XRP
sellPrice
70,2
buyPrice
70,1
lastTradePrice
70,2
还不是一个完美整洁的版本,但这里有: 版本2(少1个循环)-由于API调用超时,我切换到从文件中读取JSON
Option Explicit
Public Sub test3()
Dim fso As FileSystemObject
Dim JsonTS As TextStream
Dim JsonText As String
Set fso = New FileSystemObject
Set JsonTS = fso.OpenTextFile(ThisWorkbook.Path & Application.PathSeparator & "newFile.txt", ForReading)
JsonText = JsonTS.ReadAll
JsonTS.Close
Dim JSON As Object
Dim Dict As Dictionary
Dim key As Variant
Set JSON = ParseJson(JsonText)
For Each Dict In JSON 'loop items of collection which returns dictionaries of dictionaries
For Each key In Dict(Dict.Keys(0))
Debug.Print Dict.Keys(0) & " - " & key & ":" & Dict(Dict.Keys(0))(key)
Next key
Next Dict
End Sub
第1版:
Option Explicit
Public Sub test()
Dim strResult As String
Dim objHTTP As Object
Dim URL As String
Dim JSON As Object
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "https://bitbns.com/order/getTickerAll"
objHTTP.Open "GET", URL, False
objHTTP.Send
Set JSON = JsonConverter.ParseJson(objHTTP.ResponseText)
Dim currItem As Dictionary
Dim DictKey As Variant
Dim targetValue As Variant
For Each currItem In JSON 'loop items of collection which returns dictionaries of dictionaries
For Each DictKey In currItem.Keys 'currItem is a dictionary; dictKey is a key
For Each targetValue In currItem(DictKey).Keys 'currItem(DictKey) returns a dictionary
Debug.Print DictKey & "-" & targetValue & ": " & currItem(DictKey)(targetValue)
Next targetValue
Next DictKey
Next currItem
End Sub
我使用OP的代码得到了同样的结果。必须添加声明。我错过了什么吗?@Vityata是的,我投了更高的票。显然[]表示数组,{}表示对象,即设置对象和循环数组。。。。我还在这里探索。我在看这个的结构,虽然JSON是一个稍微不同的方法,如果可以从这个正确的水平上升,应该能够通过他们的指数访问价格数组。几乎就是您的obj=JSON(cnt)(someItem)。也就是说,如果不知道指数的数量,那么你的方法就更明智了。@Vityata我还没有做到一行。我不知道如何返回所有内部字典项的数组而不循环每个外部字典项。我给出了一个非常混乱的答案,下面是冗长的路线。一旦我开始思考[]=Collection和{}=Dictionary,总体上哪一个可能是错误的,如何访问元素似乎很清楚。1无嵌套循环就可以了:)