系列文章索引
Excel 也可以玩 REST
Excel 也可以玩 REST (2)
Excel 也可以玩 REST (3)
本篇来做几个准备动作,讲解一下接下来需要用到的 VBA 转 Json 格式,以及涉及到的 VBA 字符串中 双引号 的处理方法。
VBA 字符串的双引号问题
首先我们来看看 双引号 问题。为什么要提到这个呢?因为如果使用 Ajax 原生 POST 请求,请求头里设置 Content-Type:application/json
,请求的参数会显示在 Request Payload 中。Json 格式自然要用到双引号。
假设我们有这样一个 json 字符串:
{
"username": "admin",
"password": "w123456"
}
对于习惯了多年 Python 类似语言对 json 字符串的简洁,打心底对 VBA 的麻烦深恶痛绝。在 VBA 中,表达上面的字符串有两种方法,第一种方法,使用 Chr(34)
函数。ASCII 码 34 对应双引号。这种方法这个 json 字符串看起来是这样的:
Dim payload As String
payload = "{" & Chr(34) & "username" & Chr(34) & ":" _
& Chr(34) & "admin" & Chr(34) & "," & Chr(34) _
& "password" & Chr(34) & ":" & Chr(34) & "123456" & Chr(34) & "}"
是不是非常不直观?而且容易弄错对吧?那么看看第二种方法。使用 ""
(两个双引号) 表达一个双引号。不知道为啥微软不用其他语言类似的转义字符 (escape characters)。用第二种方法的代码如下:
Dim payload As String
payload = "{" & """username""" _
& ":" & """admin""" & "," _
& """password""" & ":" & """123456""" & "}"
感觉好一点,但要习惯一下。我思考了一下,觉得可以先用单引号,然后用 Replace()
函数将单引号替换成双引号的方式,不是 VBA 标准的字符串表达方法,但相对直观:
Dim payload As String
payload = "{'username':'admin','password':'123456'}"
payload = Replace(payload, "'", Chr(34))
如果是很复杂的 json 字符串,用以上方法都是极不好的。所以,接下来就隆重介绍上一篇博文所提到的 https://github.com/VBA-tools/VBA-JSON 模块。这个模块的 ConvertToJson()
函数可以将 Dictionary,Collection 和 Array 转换成 Json 字符串。用起来也简单:
Public Sub convert_json_test()
Dim loginData As New Dictionary
loginData.Add "username", "admin"
loginData.Add "password", "123456"
Debug.Print JsonConverter.ConvertToJson(loginData)
End Sub
Excel 数据如何转成 Json
VBA-JSON 这个模块,还可以方便地将 Excel 中的数据转换成 Json 字符串,对需要转换类似数据库中数据表的数据也很方便。上一篇我们从网页中得到了如下图所示的数据:
现在需要将数据再转换成为 Json。因为每一行数据都是具有相同数据结构,所以自然要用到 Json 数组,最后的结果应该类似下面这样:
{
"value": [
{
"ID": 0,
"Name": "Bread",
"Description": "Whole grain bread",
"ReleaseDate": "1992-01-01T00:00:00",
"Rating": 4,
"Price": 2.5
},
{
"ID": 1,
"Name": "Milk",
"Description": "Low fat milk",
"ReleaseDate": "1995-10-01T00:00:00",
"Rating": 3,
"Price": 3.5
}
...
]
}
类似地,我们使用 Dictionary 和 Collection 来达到目的:
Public Sub sheet_to_json()
Dim dict(1 To 11) As New Dictionary
Dim prodCol As New Collection
Dim i As Integer
For i = 1 To 11
dict(i).Add "ID", Sheet1.Cells(i + 1, 1).Value
dict(i).Add "Name", Sheet1.Cells(i + 1, 2).Value
dict(i).Add "Description", Sheet1.Cells(i + 1, 3).Value
dict(i).Add "ReleaseDate", Sheet1.Cells(i + 1, 4).Value
dict(i).Add "DiscontinuedDate", Sheet1.Cells(i + 1, 5).Value
dict(i).Add "Rating", Sheet1.Cells(i + 1, 6).Value
dict(i).Add "Price", Sheet1.Cells(i + 1, 7).Value
prodCol.Add dict(i)
Next
Debug.Print "{" & """value""" & ":" & JsonConverter.ConvertToJson(prodCol) & "}"
End Sub
基本上,这个可以作为 Excel 转 Json 的通用方法了。有了本篇的准备,接下来可以在 Excel 中提交各种 http 请求。后面的博文准备接着讲解基于 http 请求实现数据库 CRUD 的操作。也会说说基于 Excel 的 http 请求有什么应用场景。