You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:27:47