如何用VBA将JSON解析生成的对象内容写入文本文件?
解决VBA将JSON解析后的嵌套对象写入文本文件的问题
你之前的核心错误是把JSON解析后的对象当成Excel单元格区域(Range)处理,但实际上JSON解析后得到的通常是**Dictionary(键值对)或Collection(数组/列表)**类型,嵌套对象就是字典里包含字典/集合、集合里包含字典/集合。要写入文件,需先递归遍历对象,将其转换为结构化文本(比如还原为格式化JSON)。
步骤1:编写递归转换函数
这个函数会遍历对象的所有层级,把不同类型的数据转换成可读的结构化字符串:
Function ConvertObjectToString(obj As Variant, Optional indent As Integer = 0) As String Dim indentStr As String, key As Variant, item As Variant indentStr = String(indent * 4, " ") ' 用4个空格作为缩进 Select Case VarType(obj) Case vbDictionary ' 处理键值对对象 ConvertObjectToString = indentStr & "{" & vbNewLine For Each key In obj.Keys ConvertObjectToString = ConvertObjectToString & indentStr & " """ & key & """: " & _ ConvertObjectToString(obj(key), indent + 1) & "," & vbNewLine Next key ' 去掉最后一个多余的逗号 If Len(ConvertObjectToString) > Len(indentStr & "{") Then ConvertObjectToString = Left(ConvertObjectToString, Len(ConvertObjectToString) - 2) & vbNewLine End If ConvertObjectToString = ConvertObjectToString & indentStr & "}" Case vbCollection ' 处理数组/列表对象 ConvertObjectToString = indentStr & "[" & vbNewLine For Each item In obj ConvertObjectToString = ConvertObjectToString & ConvertObjectToString(item, indent + 1) & "," & vbNewLine Next item ' 去掉最后一个多余的逗号 If Len(ConvertObjectToString) > Len(indentStr & "[") Then ConvertObjectToString = Left(ConvertObjectToString, Len(ConvertObjectToString) - 2) & vbNewLine End If ConvertObjectToString = ConvertObjectToString & indentStr & "]" Case vbString ' 字符串类型添加引号,转义内部双引号 ConvertObjectToString = indentStr & """" & Replace(obj, """", "\""") & """" Case vbBoolean, vbInteger, vbLong, vbSingle, vbDouble, vbDate ' 基本数据类型直接转字符串 ConvertObjectToString = indentStr & CStr(obj) Case Else ' 未知类型标记 ConvertObjectToString = indentStr & "[Unknown Type: " & TypeName(obj) & "]" End Select End Function
步骤2:修改导出函数,调用转换逻辑
调整你的原代码,用转换函数生成字符串后写入文件:
Public Sub ExportObject(obj As Variant) Dim filePath As String Dim fileNumber As Integer filePath = "C:\Mypath\myfilename.txt" ' 直接拼接完整文件路径 fileNumber = FreeFile Open filePath For Output As fileNumber ' 将对象转换为结构化字符串并写入 Print #fileNumber, ConvertObjectToString(obj) Close fileNumber End Sub
补充说明
- 该方案适配主流VBA JSON解析库(如VBA-JSON),这类库解析后返回的就是Dictionary/Collection对象;若你的解析库返回其他类型,只需调整
VarType的判断分支即可。 - 生成的文本是格式化后的JSON格式,可读性强,也可直接重新解析回对象;若需要自定义输出格式(比如每行显示一组键值对),修改递归函数的输出逻辑即可。
- 原代码的其他错误:
filenumber应定义为Integer,filepath未定义需直接拼接路径和文件名,遍历rows/cells的逻辑仅适用于Excel Range,不适用于JSON对象。
内容的提问来源于stack exchange,提问作者vba_enjoyer
相关产品推荐
相关产品推荐

