как создать вложенный json файл с помощью VBA - PullRequest
1 голос
/ 13 января 2020

В моем проекте я создаю файл JSON с кодом VBA. Я хочу создать вложенный файл JSON, чтобы использовать значение моей ячейки Excel. Для этого я написал следующий код, но он не создает вложенный файл JSON, и я не знаю, как это сделать.

Dim excelRange As Range
Dim jsonItems As New Collection
Dim jsonDictionary As New Dictionary
Dim jsonFileObject As New Scripting.FileSystemObject
Dim jsonFileExport As TextStream
Dim a As Long
Dim cell As Variant

Set excelRange = Cells(2, 1).CurrentRegion


For a = 2 To excelRange.Rows.Count
    jsonDictionary("refType") = Cells(a, 6)
    jsonDictionary("reference") = Cells(a, 1)
    jsonDictionary("engType") = "A5"
    jsonDictionary("DMC") = Cells(a, 16)
    jsonDictionary ("subTasks")

    jsonItems.Add jsonDictionary
    Set jsonDictionary = Nothing
Next a


Set jsonFileExport = jsonFileObject.CreateTextFile("C:\Users\ftk1187\Desktop\jsonExample.json", True)
jsonFileExport.WriteLine (JsonConverter.ConvertToJson(jsonItems, Whitespace:=3))

Я хочу создать вложенный JSON в разделе подзадачи . Я хочу сделать что-то вроде этого. enter image description here

После многих попыток и помощи Коэна я решаю проблему. Окончательная форма кодов, подобных этому

Dim excelRange As Range
Dim jsonItems As New Collection
Dim jsonDictionary As New Dictionary
Dim jsonDictionary2 As New Dictionary
Dim jsonFileObject As New Scripting.FileSystemObject
Dim jsonFileExport As TextStream
Dim a As Long
Dim cell As Variant
Dim wrdArray() As String


Set excelRange = Cells(2, 1).CurrentRegion
k = 0
For a = 2 To excelRange.Rows.Count
    Set jsonDictionary = New Dictionary
    jsonDictionary("refType") = Cells(a, 6)
    jsonDictionary("reference") = Cells(a, 1)
    jsonDictionary("engType") = "A5"
    jsonDictionary("DMC") = Cells(a, 16)
    wrdArray() = Split(Cells(a, 17), ";")
    Set jsonDictionary2 = New Dictionary
    For c = 0 To UBound(wrdArray) - 1
            jsonDictionary2("SUBTASK" & c) = subs(c + k)
    Next c
    k = k + UBound(wrdArray)
    jsonDictionary.Add "subTasks", jsonDictionary2
    jsonItems.Add jsonDictionary
    'Set jsonDictionary = Nothing
    'Set jsonDictionary2 = Nothing
Next a


Set jsonFileExport = jsonFileObject.CreateTextFile("C:\Users\ftk1187\Desktop\jsonExample.json", True)
jsonFileExport.WriteLine (JsonConverter.ConvertToJson(jsonItems, Whitespace:=3))

1 Ответ

1 голос
/ 14 января 2020

Вдохновленный этим сообщением VBA- JSON Создание вложенных объектов -> попробуйте следующий код. Так как вы не опубликовали, как должен выглядеть ваш JSON, надеюсь, вы можете взять его отсюда?

Set c1 = New Collection

For a = 2 To 3
    Set d1 = New Dictionary
    d1("refType") = "A"
    d1("reference") = 2 * a
    d1("engType") = "A5"
    d1("DMC") = "txt"

    Set c2 = New Collection
    For B = 10 To 12
        c2.add "nr-123-" & B
    Next B
    d1.Add "subtasks", d2
    c1.Add d1
Next a

TempTxt = JsonConverter.ConvertToJson(c1, Whitespace:=1)
Debug.Print TempTxt

Пример вывода:

[
 {
  "refType": "A",
  "reference": 4,
  "engType": "A5",
  "DMC": "txt",
  "subtasks": [
   "nr-123-10",
   "nr-123-11",
   "nr-123-12"
  ]
 },
 {
  "refType": "A",
  "reference": 6,
  "engType": "A5",
  "DMC": "txt",
  "subtasks": [
   "nr-123-10",
   "nr-123-11",
   "nr-123-12"
  ]
 }
]

Есть один неприятный момент : вы не можете иметь несколько значений ключа с одним и тем же ключом в одном массиве. Таким образом, ваш список из нескольких «подзадач» не будет работать. Поэтому вам придется либо взламывать их впоследствии, либо писать их вручную построчно. В этом случае я создал для них массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...