当前位置: 首页 > 面试题库 >

在Excel VBA中解析JSON

卫甫
2023-03-14
问题内容

我有与Excel VBA中相同的问题:解析的JSON对象循环,但是找不到任何解决方案。我的JSON具有嵌套对象,因此建议的解决方案(如VBJSON和vba-json)不适用于我。我还修复了其中之一,使其正常工作,但是由于doProcess函数的许多递归,结果是调用堆栈溢出。

最好的解决方案似乎是原始帖子中看到的jsonDecode函数。它非常快速且非常有效。我的对象结构全部位于类型JScriptTypeInfo的通用VBA对象中。

此时的问题是我无法确定对象的结构,因此,我事先不知道将驻留在每个通用对象中的键。我需要遍历通用VBA对象以获取键/属性。

如果我的解析javascript函数可以触发VBA函数或sub,那就太好了。


问题答案:

如果要在的基础上构建ScriptControl,则可以添加一些帮助程序方法以获取所需的信息。该JScriptTypeInfo对象有点不幸:它包含所有相关信息(如您在“
监视” 窗口中看到的那样),但似乎无法使用VBA来实现。但是,JavaScript引擎可以帮助我们:

Option Explicit

Private ScriptEngine As ScriptControl

Public Sub InitScriptEngine()
    Set ScriptEngine = New ScriptControl
    ScriptEngine.Language = "JScript"
    ScriptEngine.AddCode "function getProperty(jsonObj, propertyName) { return jsonObj[propertyName]; } "
    ScriptEngine.AddCode "function getKeys(jsonObj) { var keys = new Array(); for (var i in jsonObj) { keys.push(i); } return keys; } "
End Sub

Public Function DecodeJsonString(ByVal JsonString As String)
    Set DecodeJsonString = ScriptEngine.Eval("(" + JsonString + ")")
End Function

Public Function GetProperty(ByVal JsonObject As Object, ByVal propertyName As String) As Variant
    GetProperty = ScriptEngine.Run("getProperty", JsonObject, propertyName)
End Function

Public Function GetObjectProperty(ByVal JsonObject As Object, ByVal propertyName As String) As Object
    Set GetObjectProperty = ScriptEngine.Run("getProperty", JsonObject, propertyName)
End Function

Public Function GetKeys(ByVal JsonObject As Object) As String()
    Dim Length As Integer
    Dim KeysArray() As String
    Dim KeysObject As Object
    Dim Index As Integer
    Dim Key As Variant

    Set KeysObject = ScriptEngine.Run("getKeys", JsonObject)
    Length = GetProperty(KeysObject, "length")
    ReDim KeysArray(Length - 1)
    Index = 0
    For Each Key In KeysObject
        KeysArray(Index) = Key
        Index = Index + 1
    Next
    GetKeys = KeysArray
End Function


Public Sub TestJsonAccess()
    Dim JsonString As String
    Dim JsonObject As Object
    Dim Keys() As String
    Dim Value As Variant
    Dim j As Variant

    InitScriptEngine

    JsonString = "{""key1"": ""val1"", ""key2"": { ""key3"": ""val3"" } }"
    Set JsonObject = DecodeJsonString(CStr(JsonString))
    Keys = GetKeys(JsonObject)

    Value = GetProperty(JsonObject, "key1")
    Set Value = GetObjectProperty(JsonObject, "key2")
End Sub

一些注意事项:

  • 如果JScriptTypeInfo实例引用Javascript对象,For Each ... Next将无法正常工作。但是,如果它引用Javascript数组,则它确实起作用(请参见GetKeys函数)。
  • 名称仅在运行时已知的访问属性使用函数GetPropertyGetObjectProperty
  • JavaScript的阵列提供性能length0Item 01Item 1等有了VBA点符号(jsonObject.property),只有length属性访问,则只有声明一个变量叫length所有的小写字母。否则,案例将不匹配,并且找不到。其他属性在VBA中无效。因此最好使用该GetProperty功能。
  • 该代码使用早期绑定。因此,您必须添加对“ Microsoft Script Control 1.0”的引用。
  • InitScriptEngine在使用其他功能进行一些基本初始化之前,您必须调用一次。


 类似资料:
  • 问题内容: 我有以下JSON字符串: 如何在PHP中解析它并提取s 列表? 问题答案: 您可以使用该函数来解析PHP中的JSON数据(至少=> 5.2.0)。一旦有了PHP对象,就可以轻松地遍历所有配方/成员并使用以下内容访问其标题: (对不起,我现在无法真正运行此代码。希望无论如何它都会有所帮助。)

  • 问题内容: 我在解析Json文件时遇到问题。尝试解析一个Json文件: 这是我为其定义的两个结构。 暂停结构: AttachedModel模型结构: 然后,我为其创建一个键和一个函数: 在功能上: 这是输出 问题是,即使有数据,该行也始终为假,并且转到“ 有人可以告诉我这里的问题在哪里吗? 问题答案: 为您的json创建此模型类: 然后,您可以像这样解析它:

  • 问题内容: 我想解析JavaScript中的JSON字符串。响应就像 我怎样才能获得的值,并从这个? 问题答案: 在JavaScript中解析JSON的标准方法是 该API是在ES5(2011)中引入的,此后按市场份额和Node.js在超过99%的浏览器中已实现。它的用法很简单: 唯一无法使用的时间是您是否在为旧版浏览器编程,例如IE 7(2006),IE 6(2001),Firefox 3(20

  • 问题内容: 是否可以解析的? 我不是要创建一个字符串。相反,我想解析作为传入的字符串。 问题答案: 更新:从SQL Server 2016开始 ,现在可以在TSQL中解析JSON了。 在本地,没有任何支持。您必须使用CLR。就这么简单,除非您有巨大的受虐行为并且想要用SQL编写JSON解析器 通常,人们要求从数据库中获取JSON输出,并且互联网上有一些示例。但是进入数据库?

  • 问题内容: 我正在使用一个API,该API返回如下所示的JSON 在Swift中,我使用两个函数来获取并解析JSON 然后我用 可以很好地解析JSON。当我打印出 我得到了数组的所有内容。但是,我无法访问每个单独的索引。我很肯定这是一个数组,因为我之间 返回正确的长度。但是,如果我尝试通过使用访问单个索引 XCode关闭语法高亮显示并给我以下信息: 并且代码将无法编译。 这是XCode 6的错误,

  • 我正在使用来解析Json数据。我的Json数据如下: GsonParse.java 我使用以下方法来解析此JSON数据。 我面对以下错误。