[英]get data from a JSON string with VBA Excel
I would like to get data from a JSON-String, which is in a JSON-Array, with VBA to display the data into an Excel-Worksheet.我想从 JSON 数组中的 JSON 字符串获取数据,使用 VBA 将数据显示到 Excel 工作表中。 I'm using the library (VBA-JSON v2.3.1 JsonConverter)我正在使用库(VBA-JSON v2.3.1 JsonConverter)
I have the following JSON-Object我有以下 JSON 对象
{
"deviceMessages":[
{
"messageSource":"cc",
"externalSourceId":123,
"messageId":"blabla",
"internalDeviceId":66,
"externalDeviceId":"123456789",
"messageType":"UPLINK",
"rawMessage":"{\"hello\":\"58\",\"hello\":\"hello\",\"name\":\"Peter\",\"ID\":\"12346789\",\"rxInfo\":[{\"GT_ID\":\"123456\",\"name2\":\"20202022022020\",\"time\":\"2021-02-12T03:51:43.050959Z\",\"rss\":12,\"SN\":8,\"location\":{\"latitude\":\"XX.XX\",\"longitude\":\"X.XXXXX\",\"altitude\":\"XXX\"}}],\"Info\":{\"frequency\":XXXXXXX,\"dr\":X},\"adr\":XXX,\"nt\":XXXX,\"port\":X,\"data\":\"XXXXXXXXXXXXXX\"}",
"frame":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"createdAt":"2021-02-12T03:51:43.050Z",
"Json":"{\"temperature\":22.6,\"humidity\":37,\"light\":1,\"motion\":1,\"co2\":640,\"vdd\":3.647}",
"rs":12,
"framePort":16,
"nr":8.0,
"dataRate":5,
"counter":123456,
"GT":[
{
"id":1324,
"externalId":"123456789",
"SourceId":1234,
"companyId":66,
"sn":"xxxxxx",
"name":"hello",
"latitude":"xxxxxxxx",
"longitude":"xxxxxxx",
"range":null,
"status":"OK",
"Note":null,
"lastSeen":"2021-02-12T04:04:39Z"
}
]
}
]
}
I got the data with a VBA-code.我用 VBA 代码获得了数据。 That is working.那是有效的。
My code looks like this:我的代码如下所示:
Dim response2 As String
Dim json1 As Object
Dim ws2 As Worksheet
strUrl = "https://xxxxxxxxxxxx/devices/11/"
Set hReq = CreateObject("MSXML2.XMLHTTP")
With hReq
Set ws2 = Worksheets(3)
.Open "GET", strUrl, False
.SetRequestHeader "Authorization", "Bearer " & apitoken
.Send
response2 = hReq.responseText
Set json1 = JsonConverter.ParseJson(response2)
k = 2
For Each item In json1("deviceMessages")
ws2.Cells(k, 1) = item("createdAt")
ws2.Cells(k, 2) = item("dataFrame")
ws2.Cells(k, 3) = item("externalDeviceId")
ws2.Cells(k, 4) = item("externalSourceId")
ws2.Cells(k, 5) = item("internalDeviceId")
ws2.Cells(k, 6) = item("messageId")
ws2.Cells(k, 7) = item("messageType")
ws2.Cells(k, 8) = item("rawJson")
ws2.Cells(k, 9) = item("rawMessage")
k = k + 1
Next item
End With
How can I get the data from "Json":"如何从“Json”获取数据:”
{\"temperature\":22.6,\"humidity\":37,\"light\":1,\"motion\":1,\"co2\":640,\"vdd\":3.647} ?
For now, I get the information in a cell with the following format.现在,我在具有以下格式的单元格中获取信息。
{"temperature":22.6,"humidity":37,"light":1,"motion":1,"co2":640,"vdd":3.647}
I would like to split the data into rows and columns like this:我想将数据拆分成这样的行和列:
I just don't know how to split the information from this JSON-String.我只是不知道如何从这个 JSON-String 中拆分信息。 I was searching for a solution, but I didn't find anything, that could work with my code.我正在寻找一个解决方案,但我没有找到任何可以与我的代码一起使用的东西。
Thanks for helping me!谢谢你帮助我!
The item you are returning is, itself, a json string.您要返回的项目本身就是一个 json 字符串。 So to parse it out, in VBA, you need to create another json object.因此,要解析它,在 VBA 中,您需要创建另一个 json object。
eg:例如:
For Each Item In JSON("deviceMessages")
Set JSON2 = parsejson(Item("Json"))
Debug.Print "Temperature", JSON2("temperature")
Debug.Print "Humidity", JSON2("humidity")
'etc
Next Item
And just to show the output:只是为了展示 output:
Set JSON = parsejson(response2)
For Each Item In JSON("deviceMessages")
Set JSON2 = parsejson(Item("Json"))
For Each key In JSON2
Debug.Print key, JSON2(key)
Next key
Next Item
=> =>
temperature 22.6
humidity 37
light 1
motion 1
co2 640
vdd 3.647
Of course, you could also just use Power Query (available in Excel 2010+)当然,您也可以只使用 Power Query(在 Excel 2010+ 中可用)
Here is M-code that outputs that data.这是输出该数据的M 代码。 All can be executed from the User Interface.所有都可以从用户界面执行。
The original file is opened and parsed as a json.原始文件打开并解析为 json。
Then filter on the result for the internal JSON;然后过滤内部 JSON 的结果; split that and output as a table.将它和 output 拆分为一个表。
Examine the Applied Steps
window to see what happens at each stage of the code.检查Applied Steps
window 以查看代码的每个阶段发生了什么。
let
Source = Json.Document(File.Contents("C:\Users\ron\Desktop\text3.json")),
deviceMessages = Source[deviceMessages],
deviceMessages1 = deviceMessages{0},
#"Converted to Table" = Record.ToTable(deviceMessages1),
#"Filtered Rows" = Table.SelectRows(#"Converted to Table", each ([Name] = "Json")),
#"Added Custom" = Table.AddColumn(#"Filtered Rows", "Custom", each Json.Document([Value])),
Custom = #"Added Custom"{0}[Custom],
#"Converted to Table1" = Record.ToTable(Custom),
#"Transposed Table" = Table.Transpose(#"Converted to Table1"),
#"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"temperature", type number}, {"humidity", Int64.Type}, {"light", Int64.Type}, {"motion", Int64.Type}, {"co2", Int64.Type}, {"vdd", type number}})
in
#"Changed Type"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.