在VBA中将对象转换为JSON

时间:2015-10-10 23:40:11

标签: json vba ms-office

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

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

所以,我想知道:

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

  • 还有另一种方法(不使用对象)可以从自定义类对象到达json输出吗?

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

2 个答案:

答案 0 :(得分:2)

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

我构建了一个将VBA结构(使用Dictionary)转换为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

测试:

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

输出:

{
   "Value1":"1",
   "Value2":{
      "SubValue1":"2.1",
      "SubValue2":"2.2"
   }
}

答案 1 :(得分:0)

当我第一次开始写这个问题时,我被置于正确的状态。然后我有一个灯泡时刻为类编写一个ToDictionary方法,将对象转换为我想要的字典。

类似于:

public function ToDictionary() as string
    dim d as dictionary
    set d = new dictionary
    d.add "id" Me!id
    d.add "title" Me!title
    ...
    Set ToDictionary = d
    set d = Nothing
end function