Excel 也可以玩 REST (2)

系列文章索引


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 字符串,对需要转换类似数据库中数据表的数据也很方便。上一篇我们从网页中得到了如下图所示的数据:

Excel 也可以玩 REST (2)_第1张图片

现在需要将数据再转换成为 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 请求有什么应用场景。

你可能感兴趣的:(Excel 也可以玩 REST (2))