在 VBA 中将对象转换为 JSON

use*_*372 2 vba json ms-office

我知道可以使用像 VBAJSON 这样的库将数组或字典转换为 json,但不能使用 office 2013 中的自定义类实例。

搜索没有找到用于将对象处理为 json 的库,所以我认为必须有其他方法。

所以,我想知道:

  • 是否可以将对象递归转换为字典,以便可以进行 to-json 转换,而不必为每个类编写冗长的自定义“ToDictionary”方法?

  • 是否有另一种方式(除了不使用对象)可以从自定义类对象访问 json 输出?

    目前,我已经为每个类编写了 ToDictionary 方法以将实例输出为字典。它很乱,但可以完成工作。

Mak*_*kah 7

这是一个老问题,但没有答案,所以让我尝试用代码来回答。

我构建了一个函数来将 VBA 结构(使用字典)转换为 JSON。此函数接受嵌套对象(嵌套字典):

Function ToJson(ByVal dict As Object) As String
    Dim key As Variant, result As String, value As String

    result = "{"
    For Each key In dict.Keys
        result = result & IIf(Len(result) > 1, ",", "")

        If TypeName(dict(key)) = "Dictionary" Then
            value = ToJson(dict(key))
            ToJson = value
        Else
            value = """" & dict(key) & """"
        End If

        result = result & """" & key & """:" & value & ""
    Next key
    result = result & "}"

    ToJson = result
End Function
Run Code Online (Sandbox Code Playgroud)

测试:

Sub MyTest()
    Dim body As String
    Set dictSubValues = CreateObject("Scripting.Dictionary")
    Set dictBody = CreateObject("Scripting.Dictionary")

    dictSubValues.Add "SubValue1", "2.1"
    dictSubValues.Add "SubValue2", "2.2"

    dictBody.Add "Value1", "1"
    dictBody.Add "Value2", dictSubValues

    body = ToJson(dictBody)
    Debug.Print (body)
End Sub
Run Code Online (Sandbox Code Playgroud)

输出:

{
   "Value1":"1",
   "Value2":{
      "SubValue1":"2.1",
      "SubValue2":"2.2"
   }
}
Run Code Online (Sandbox Code Playgroud)