Zo snel mogelijk gegevens uit een JSON file halen

Status
Niet open voor verdere reacties.

BjorntobeWild

Gebruiker
Lid geworden
29 aug 2011
Berichten
120
Hoi,

Ik heb een JSON file welke is gegenereerd vanuit een database. Nu wil ik op een zo snel mogelijke manier de gegevens in een Excel Sheet verwerken. Momenteel heb ik het zo opgebouwd dat de kolomnamen van de database één voor één worden weggeschreven in een sheet en vervolgens worden alle regels één voor één in de sheet gekopieerd.
Nu zitten er nogal veel regels in de tabel waardoor het op deze manier een tijdrovende klus wordt. Ik denk dat het nl. veel sneller kan, maar weet niet hoe... Wie weet dat één van jullie mij kan helpen.
Hieronder een stukje van de JSON file en mijn VBA code.


Code:
        "Rows": [
            ["0", "Nieuw", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
            ["d146a093-5d32-4c60-bfbd-a8a70147accc", "Naam 1", "18-03-2018", null, "Monteur 1", null, null, "0.0", "0.0", "0", "0.0", "0.0", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
            ["d146a093-5d32-4c60-bfbd-a8a70147accc-1", "Naam 2", "18-03-2018", null, "Monteur 2", null, null, "0.0", "0.0", "0", "0.0", "0.0", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
        ],

Code:
    ' Data
    Dim x As Integer
    Dim y As Integer
    Dim r As Integer
    
    y = 1
    x = 1
    For Each dLevelOne In JSON("DataSource")("Headers")
        Blad10.Cells(x, y).Value = dLevelOne("Name")
        'Debug.Print "Id: " & dLevelOne("Name") '("Id")
        y = y + 1
    Next dLevelOne
    
    Dim varArr As Variant
    Dim b As Long
    y = 1 'kolomnummer sheet
    x = 1 'kolomnummer DSS
    r = 2 'regelnummer
    'rijen ophalen en in Blad10 (spuikaart) plaatsen
    For Each dLevelTwo In JSON("DataSource")("Rows")
        varrarr = dLevelTwo.Count
        
        For b = LBound(varArr, 1) To UBound(varArr, 1) Step 1
        
        
        For Each Item In dLevelTwo
            Blad10.Cells(r, y).Value = dLevelTwo(x)
            Debug.Print dLevelTwo.Item(x)
            y = y + 1
            x = x + 1
            If x = dLevelTwo.Count + 1 Then
                r = r + 1
                x = 1
                y = 1
            End If
       Next Item
    Next dLevelTwo
 
Beste Ed,

Hartelijk dank voor je antwoord. Het probleem bij mij is dat ik mijn JSON file rechtstreeks genereer vanaf het internet. Het is geen lokaal bestand. Ik zie ook niet de mogelijkheid om de JSON file in te laden zoals ze in jou link aangeven. Ik werk met Office 2013. Dit zou eventueel wel kunnen in een hogere versie van Exel.

Groet,

Bjorn
 
Waarom heeft de JSON geen key:value opbouw?
 
Waarschijnlijk moet in je string wat onvolkomenheden aan het begin en het eind verwijderen.
Code:
Option Explicit

Public Sub JSONArrayToRange()
    Dim avntLine As Variant
    Dim lngColumn As Long
    Dim lngRow As Long
    Dim objLine As Object
    Dim objLines As Object
    Dim strJSON As String
        strJSON = "[[""0"", ""Nieuw"", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],[""d146a093-5d32-4c60-bfbd-a8a70147accc"", ""Naam 1"", ""18-03-2018"", null, ""Monteur 1"", null, null, ""0.0"", ""0.0"", ""0"", ""0.0"", ""0.0"", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],[""d146a093-5d32-4c60-bfbd-a8a70147accc-1"", ""Naam 2"", ""18-03-2018"", null, ""Monteur 2"", null, null, ""0.0"", ""0.0"", ""0"", ""0.0"", ""0.0"", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]]"
        With CreateObject("ScriptControl")
            .Language = "JScript"
            Set objLines = .Eval("(" + strJSON + ")")
            For Each objLine In objLines
                lngRow = lngRow + 1
                avntLine = Split(objLine, ",")
                For lngColumn = 0 To UBound(avntLine)
                    Cells(lngRow, lngColumn + 1).Value = avntLine(lngColumn)
                Next
            Next
        End With
End Sub
 
Laatst bewerkt:
Een echt JSON bestand hier plaatsen lijkt me het handigst. Nu is geen verschil te zien tussen spaties, tabs, linefeeds, etc.
 
Ik weet niet waarom, maar als ik de macro opstart vanuit de sheet m.b.v. van een knop dan laadt deze wel snel de JSON file in. Ik had de macro alleen maar getest in de editor en daar bleek de worksheet zich enorm langzaam te vullen met gegevens.
Misschien dat iemand weet waardoor de uitvoer in de VBA editor langzamer is dan wanneer je de macro opstart vanuit de sheet?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan