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

VBA解析JSON遇类型不兼容问题,如何从JsonObject获取项值?

解决VBA读取JSON时的类型不兼容错误及JSON转XML实现

错误原因分析

你的JSON结构中,Header是单个对象(使用{}包裹),而非数组([]包裹)。当你用For Each Item In jsonFile("CRM").Item("Header")遍历的时候,实际上是在遍历Header对象的所有键名(比如"ID"、"GSID"这类字符串),此时Item是字符串类型,调用Item("GSID")自然会触发"类型不兼容"错误。

修正后的读取代码

直接访问Header对象的属性即可,不需要循环:

Dim strFooter As String, strHeader As String
Dim fso As FileSystemObject
Dim strFileContent As String
Dim strFile As String, strFilePath As String, strFilePathInput As String
Dim srtVat As String, strCompanyID As String, strCompanyName As String
Dim xmlFile As Object
Dim jsonFileInput As TextStream
Dim jsonFile As Object ' 声明为Object类型

Set fso = New FileSystemObject ' 初始化文件系统对象
Set jsonFileInput = fso.OpenTextFile(strFilePathInput & strFile, ForReading)
strFileContent = jsonFileInput.ReadAll
jsonFileInput.Close ' 读取完成后关闭文件流

Set jsonFile = JsonConverter.ParseJson(strFileContent)

' 直接读取Header中的属性
Debug.Print jsonFile("CRM")("Header")("GSID")
Debug.Print jsonFile("CRM")("Header")("ID")
Debug.Print jsonFile("CRM")("Header")("MessageID")

完整JSON转XML示例(处理多个文件)

下面是遍历指定文件夹下所有JSON文件,提取值并生成XML的完整代码:

Sub ConvertJsonToXml()
    Dim fso As FileSystemObject
    Dim jsonFolder As Folder, jsonFile As File
    Dim jsonTextStream As TextStream
    Dim jsonContent As String
    Dim jsonObj As Object
    Dim xmlDoc As Object, xmlRoot As Object, xmlHeader As Object
    Dim outputXmlPath As String
    
    ' 初始化对象
    Set fso = New FileSystemObject
    Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
    xmlDoc.async = False
    xmlDoc.preserveWhiteSpace = True
    
    ' 输入输出路径设置(替换为你的实际路径)
    Dim inputJsonPath As String
    inputJsonPath = "C:\YourJsonFolder\"
    outputXmlPath = "C:\YourXmlOutput\"
    
    ' 创建输出文件夹(如果不存在)
    If Not fso.FolderExists(outputXmlPath) Then
        fso.CreateFolder outputXmlPath
    End If
    
    ' 遍历所有JSON文件
    Set jsonFolder = fso.GetFolder(inputJsonPath)
    For Each jsonFile In jsonFolder.Files
        If LCase(fso.GetExtensionName(jsonFile.Name)) = "json" Then
            ' 读取JSON文件内容
            Set jsonTextStream = jsonFile.OpenAsTextStream(ForReading)
            jsonContent = jsonTextStream.ReadAll
            jsonTextStream.Close
            
            ' 解析JSON
            Set jsonObj = JsonConverter.ParseJson(jsonContent)
            
            ' 创建XML结构
            xmlDoc.LoadXML("<Root></Root>")
            Set xmlRoot = xmlDoc.DocumentElement
            
            ' 创建Header节点并添加属性
            Set xmlHeader = xmlDoc.CreateElement("Header")
            xmlHeader.setAttribute "ID", jsonObj("CRM")("Header")("ID")
            xmlHeader.setAttribute "GSID", jsonObj("CRM")("Header")("GSID")
            xmlHeader.setAttribute "MessageID", jsonObj("CRM")("Header")("MessageID")
            xmlHeader.setAttribute "SenderID", jsonObj("CRM")("Header")("SenderID")
            xmlHeader.setAttribute "PayloadVersionID", jsonObj("CRM")("Header")("PayloadVersionID")
            xmlRoot.appendChild xmlHeader
            
            ' 可继续添加其他需要提取的节点(如Payload部分)
            
            ' 保存XML文件
            xmlDoc.Save outputXmlPath & fso.GetBaseName(jsonFile.Name) & ".xml"
        End If
    Next jsonFile
    
    MsgBox "转换完成!", vbInformation
End Sub

注意事项

  • 确保已导入VBA-JSON模块(JsonConverter),将模块代码复制到你的VBA项目中即可使用。
  • 所有变量建议显式声明类型(原代码中部分变量未指定类型,默认会变为Variant类型)。
  • 文件操作后务必关闭流,避免资源占用。

内容的提问来源于stack exchange,提问作者Andi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 19:52:37