json 使用带有变量键的.Items属性编辑嵌套字典中的值

snz8szmq  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个使用VBA-JSON库创建的嵌套字典。至少目前它是一个具有任意数量的子字典和任意组织中的条目的字典,没有集合或其他对象。下面是我使用的JSON的一个示例。

{
  "Product": {
    "Name": "Delta 14in Bandsaw",
    "Model#": "258-40",
    "Catalog#": "10XXXX",
    "Dimensions": {
      "DimMM": {
        "Height": "1500",
        "Width": "400",
        "Depth": "300"
      }
    }
  }
}

我需要能够访问字典和子字典中每个成员的值,并单独更新它,我认为Dictionaries的.Item属性可以实现这一点。
x一个一个一个一个x一个一个二个x
上面的两个例子都很好用,但是当有任意数量的嵌套字典时,我找不到一种方法来为整个字典路径使用变量

a = "Product"
b = "Dimensions"
c = "DimMM"
d = "Height"

Parsed(a)(b)(c).item(d) = "1500"

上面的方法也可以工作,但是当我需要动态构建任意深度的路径时,就没有多大帮助了。
我最初认为我可以构造一个字符串作为路径,如下所示(我知道有一些语法问题,我的实际方法涉及Join和常量来表示双引号)

pString = "("Product")("Dimensions")("DimMM")"
itemPath = "Height"
dict(pString).item(itemPath) = "1500"

字符串方法的任何版本都不起作用,我得到错误424:Object Required.我很快意识到字符串方法不起作用,因为它要查找对象名,而(“Product”)(“Dimensions”)(“DimMM”)是三个对象名作为一个字符串,而不是一个。
我觉得我在这里遗漏了一些非常明显的东西,我如何构造对象名称以输入到.Item属性中?我的方法总体上是不是很差?是否有其他更直接的方法来更新字典成员?

2ic8powd

2ic8powd1#

你可以这样做:

Sub Tester()

    Dim json As Object
    
    Set json = JsonConverter.ParseJson(Range("A1").Value)
    
    Debug.Print JsonValue(json, "Product/Name")                     '>> Delta 14in Bandsaw
    Debug.Print JsonValue(json, "Product/Dimensions/DimMM/Height")  '>> 1500
    JsonValue json, "Product/Dimensions/DimMM/Height", 1600         'set new value
    Debug.Print JsonValue(json, "Product/Dimensions/DimMM/Height")  '>> 1600
    
End Sub

'read/set the value of a key at the end of a json path
Function JsonValue(json, path As String, Optional v = Empty)
    Dim obj As Object, el As String, arr, i As Long
    Set obj = json
    arr = Split(path, "/") 'split path to an array
    For i = LBound(arr) To UBound(arr) - 1
        Set obj = obj(arr(i)) 'assign next object in path
    Next i
    JsonValue = obj(arr(UBound(arr))) 'return current value (key is last item in array)
    If Not IsEmpty(v) Then obj(arr(UBound(arr))) = v 'optionally update the value if a new value was passed
End Function

(only使用嵌套字典测试-如果您还需要处理集合/数组,可能需要调整)

相关问题