Общие сведения:
Вы можете очистить все это с помощью следующего кода, который использует JSON converter :
Примечание:
Я читаю строку JSON из листа и сохраняю в объекте через JSONConverter
. Начальный объект - это коллекция. Я зацикливаю эту коллекцию и каждый вложенный уровень, используя TypeName
function *, чтобы определить, какие объекты хранятся на каждом уровне. Затем я использую Select Case
для соответствующей обработки этих объектов.
Более эффективным было бы создать повторно используемый класс, чтобы справиться с этим. Я видел несколько других вопросов о SO, где это делается.
* VarType на самом деле более устойчивый
Пример JSON

Пример вывода кода в непосредственное окно:
Вы можете выбрать способ записи в ячейку, заменив операторы Debug.Print
назначениями диапазонов листов.

VBA:
Option Explicit
Public Sub GetInfoFromSheet()
Dim jsonStr As String
jsonStr = [A1] '<== read in from sheet
Dim json As Object
Set json = JsonConverter.ParseJson(jsonStr)
Dim i As Long, j As Long, key As Variant
For i = 1 To json.Count
For Each key In json(i).keys
Select Case key
Case "name", "type"
Debug.Print key & " " & json(i)(key)
Case Else
Select Case TypeName(json(i)(key))
Case "Dictionary"
Dim key2 As Variant
For Each key2 In json(i)(key)
Select Case TypeName(json(i)(key)(key2))
Case "Collection"
Dim k As Long
For k = 1 To json(i)(key)(key2).Count
Debug.Print key & " " & key2 & " " & json(i)(key)(key2)(k)
Next k
Case Else
Debug.Print key & " " & key2 & " " & json(i)(key)(key2)
End Select
Next key2
Case "Collection"
For j = 1 To json(i)(key).Count '<== "actions"
Dim key3 As Variant
For Each key3 In json(i)(key)(j).keys
Select Case TypeName(json(i)(key)(j)(key3))
Case "String", "Boolean", "Double"
Debug.Print key & " " & key3 & " " & json(i)(key)(j)(key3)
Case Else
Dim key4 As Variant
For Each key4 In json(i)(key)(j)(key3).keys
Debug.Print key & " " & key3 & " " & key4 & " " & json(i)(key)(j)(key3)(key4)
Next key4
End Select
Next key3
Next j
Case Else
Debug.Print key & " " & json(i)(key)
End Select
End Select
Next key
Next i
End Sub
ТЛ; др; Учебное место:
Таким образом, вышеприведенное, возможно, было немного полным, так как он получает все без особых объяснений. Ниже мы более подробно рассмотрим, как настроить таргетинг на некоторые из этих JSON и «говорить» через связанный VBA.
Для этого вы можете использовать онлайн-анализатор JSON, чтобы более четко увидеть структуру вашего JSON
. Я разместил вашу JSON
строку в Json Parser Online , а затем исследовал структуру в String/parseJS eval
; левая часть. Доступны и другие инструменты.
Начальная вещь, которую нужно отметить, это начало "["
. Самый первый, который вы можете увидеть ниже.

Обозначает объект Collection
, который является вашей JSON
строкой при преобразовании с JsonConverter
. Все остальное вложено между этой открывающей скобкой "["
и ее закрывающей копией в самом конце.
Следующее, что следует отметить, это то, что это набор словарей, поэтому все, что образует «группу» внутри, является словарем.

См. "{"
, обозначающий начало словаря?
Словарь содержит ключи "name","type","actions"
и т. Д.
Первоначальное наблюдение состоит в том, что большая часть этой информации пуста, т.е. null
.
Мы можем игнорировать их с помощью теста IsNull
(я выбираю это на основе поля "name"
):
If Not IsNull(json(i)("name"))
Мы также можем видеть, что "actions"
в словарях, где "name"
не null
, содержит другую коллекцию словарей. Вы видите, что у нас есть "["
, за которым следует "{"
, как описано ранее.

Мы можем видеть, что каждый внутренний словарь имеет ключи "name", "description"
и т. Д. Мы также можем видеть, что их значения имеют разные типы данных.
Наблюдая "actions"
в структуре JSON
, вы можете видеть это (используя пример словаря):
- Строка
"name":"UTProject"
- Строка
"description":"UTProject"
- String "
pattern":"UTProject"
- Boolean
"isCheck":true
- Двухместный
"sysid":1
- Словарь
"uftaction" 'keys of ==> "sysid_uftAction":2,"code":"code uft","maxTime":10,"nbCycle":20
Итак, мы можем использовать Select Case
для обработки типа данных, протестировав с TypeName
Для примитивных булевых, строковых и двойных типов данных мы можем просто напечатать их, используя ключ, например,
json(i)("actions")(j)("isCheck")
Это будет логическим результатом того, что True
или False.
i
и j
являются индексами текущей позиции в циклах как внешней, так и внутренней коллекций.
Для словаря "uftaction"
мы можем зациклить его ключи:
For Each key2 In json(i)("actions")(j)(key).keys
Debug.Print "actions " & key & " " & key2 & " " & json(i)("actions")(j)(key)(key2)
Next key2
Конечно, вы можете получить доступ с именем ключа без петли над ключами в конце, например ::
json(i)("actions")(j)(key)("maxTime")
И везде вы можете получить доступ к определенным позициям через индекс, а не циклически, так что i
и j
будут заменены непосредственно на числовое значение. И key, key2
и т. Д. Можно заменить действительной литеральной строкой для любого заданного ключа .
Надеюсь, это дало вам больше понимания.
VBA:
Option Explicit
Public Sub GetInfoFromJSON()
Dim jsonStr As String
jsonStr = [A1] '<== read in from sheet
Dim json As Object, i As Long
Set json = JsonConverter.ParseJson(jsonStr) '<==This is a collection verified by Debug.Print TypeName(JSON)
For i = 1 To json.Count
If Not IsNull(json(i)("name")) Then
'ignore the null names which have sys id only populated
Debug.Print "name" & " " & json(i)("name")
Debug.Print "type" & " " & json(i)("type")
Dim j As Long
For j = 1 To json(i)("actions").Count 'actions are a collection of dictionaries
Dim key As Variant
For Each key In json(i)("actions")(j).keys 'dictionary
'observing actions in the JSON structure you can see there are:
' String "name":"UTProject"
'String "description":"UTProject",
'String "pattern":"UTProject",
'Boolean "isCheck":true,
'Double "sysid":1,
'Dictionary "uftaction" '==> "sysid_uftAction":2,"code":"code uft","maxTime":10,"nbCycle":20
'So we can use Select Case to handle the data type by testing with TypeName
Select Case TypeName(json(i)("actions")(j)(key))
Case "String", "Boolean", "Double" '<==good to go nothing extra needed
Debug.Print "actions " & key & " " & json(i)("actions")(j)(key)
Case Else ' we are dealing with uftaction which we know is a dictionary
Dim key2 As Variant
For Each key2 In json(i)("actions")(j)(key).keys '<==We know now we are looping the uftaction dictionary which has keys "sysid_uftAction","code","maxTime","nbCycle"
Debug.Print "actions " & key & " " & key2 & " " & json(i)("actions")(j)(key)(key2)
Next key2
End Select
Next key
Next j
End If
Next i
End Sub