.JSON bestand met Base64 encoded XML

Status
Niet open voor verdere reacties.

renco123

Gebruiker
Lid geworden
23 jan 2018
Berichten
13
Hallo,

Ik ben nieuw op het helpmij forum dus ik zal mij eerst even voorstellen:
Mijn naam is Renco, 27 jaar en woonachtig in ermelo.
Ik werk nu een jaar als functioneel NAV consultant en heb in het verleden veel gewerkt met NAV als gebruiker en met Excel (VBA).

Nu zit ik met de volgende uitdaging.

Ik heb een .JSON bestand met daarin een heleboel data, maar waar het mij om gaat zijn de 99 regels.
Op deze regels staat een base64 encoded xml string.
Wanneer deze string gedecodeerd is krijg ik een xml format met parameters. Deze parameters moet ik aanpassen.
Het .JSON bestand bevat pak hem beet 250 '99' regels met base64 strings.

Hoe kan ik in Excel VBA (of met een andere tool eventueel) deze base64 strings decoderen, aanpassen, encoderen en weer terugzetten in het .JSON bestand?
Ik heb wel online tooltjes gevonden die kunnen decoderen en encoderen, maar bij het encoderen krijg ik niet de string terug die ik verwacht.

Kan iemand van jullie mij hierbij helpen?
Het .JSON bestand heb ik bijgevoegd (uitgekleed). Deze heb ik opgeslagen als .txt zodat ik het kon uploaden hier, maar het is dus een .json bestand.

Alvast bedankt voor alle eventuele hulp.
 

Bijlagen

  • POS Menu - SALE-LEFT Package.txt
    4,7 KB · Weergaven: 43
Wat wil je veranderen in

Code:
'<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
'- <root xmlns="urn:microsoft-dynamics-nav/xmlports/x6150700">
'  <param action="LOOKUP" name="LookupType" type="5" value="Item" />
'  <param action="LOOKUP" name="View" type="0" value="" />
'  </root>
 
@snb
Code:
//48AD8AeABtAGwAIAB2AGUAcgBzAGkAbwBuAD0AIgAxAC4AMAAiACAAZQBuAGMAbwBkAGkAbgBnAD0AIgBVAFQARgAtADEANgAiACAAcwB0AGEAbgBkAGEAbABvAG4AZQA9ACIAbgBvACIAPwA+AA0ACgA8AHIAbwBvAHQAIAB4AG0AbABuAHMAPQAiAHUAcgBuADoAbQBpAGMAcgBvAHMAbwBmAHQALQBkAHkAbgBhAG0AaQBjAHMALQBuAGEAdgAvAHgAbQBsAHAAbwByAHQAcwAvAHgANgAxADUAMAA3ADAAMAAiAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIATABvAG8AawB1AHAAVAB5AHAAZQAiACAAdAB5AHAAZQA9ACIANQAiACAAdgBhAGwAdQBlAD0AIgBJAHQAZQBtACIAIAAvAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIAVgBpAGUAdwAiACAAdAB5AHAAZQA9ACIAMAAiACAAdgBhAGwAdQBlAD0AIgAiACAALwA+AA0ACgA8AC8AcgBvAG8AdAA+AA==
moet met base64 gedecodeerd, waarschijnlijk naar een xml string.
 
Laatst bewerkt:
@alpha

dat is de naar XML geconverteerde tekenreeks die ik toonde.
 
Klopt. Die "99" regels geven alleen de XML header weer, niet de array elementen uit DATA.
 
@snb

Code:
'<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
'- <root xmlns="urn:microsoft-dynamics-nav/xmlports/x6150700">
'  <param action="LOOKUP" name="LookupType" type="5" value="Item" />
'  <param action="LOOKUP" name="View" type="0" value="ABCDEFG" />
'  </root>

Dit heb ik bij wijze van test reeds gebruikt. Met een online tool om te coderen en decoderen heb ik dit geprobeerd, maar dan krijg ik een andere base64 string terug.
Zoals te zien in de json beginnen alle 99 regels met 48AD8, maar wat ik gecodeerd terugkrijg is 7768AD8.
Dit accepteert de import in Dynamics NAV niet. Als ik dit handmatig verander in 48AD8 dan krijg ik een rare tekenreeks met vraagtekens en apenstaartjes etc.
 
In Base 64 is / de laatste waarde, binair 111111.
Ik vermoed dat die 2 slashes de typeaanduiding van het bestand zijn.

Als je aangeeft wat je gewijzigd zou willen hebben in de XML code dan kan ik kijken of we dat voor elkaar kunnen krijgen.
Ik stuur je dan de base64 geconverteerde code ter controle.
 
Laatst bewerkt:
@snb

Ik heb de code in mijn vorige bericht toegevoegd inclusief de aanpassing.
Wat ik zou willen is het volgende:
- In de een naar laatste base 64 string in het json bestand wil ik in de tweede parameter action, degene met name="View", in de value: Sorting(Description) Order(Ascending) Where(Item Category Code=FILTER(HFDG2), Product Group Code=FILTER(SBG2-2))
- In de laatste base 64 string in het json bestand wil ik in de tweede parameter action, degene met name="View", in de value: ABCDEFG

Kun je hier iets mee?
 
Van je tekst kan ik geen chocola maken.

Plaats svp een voorbeeld van de exacte XML tekst voor de wijziging en na wijziging.
 
Laatst bewerkt:
Sorry, zie hieronder:

Het JSON bestand, bijgevoegd bij mijn eerste post heeft 3x een "99" regel met een base64 string:

Dit is de eerste:
"99": "//48AD8AeABtAGwAIAB2AGUAcgBzAGkAbwBuAD0AIgAxAC4AMAAiACAAZQBuAGMAbwBkAGkAbgBnAD0AIgBVAFQARgAtADEANgAiACAAcwB0AGEAbgBkAGEAbABvAG4AZQA9ACIAbgBvACIAPwA+AA0ACgA8AHIAbwBvAHQAIAB4AG0AbABuAHMAPQAiAHUAcgBuADoAbQBpAGMAcgBvAHMAbwBmAHQALQBkAHkAbgBhAG0AaQBjAHMALQBuAGEAdgAvAHgAbQBsAHAAbwByAHQAcwAvAHgANgAxADUAMAA3ADAAMAAiAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIATABvAG8AawB1AHAAVAB5AHAAZQAiACAAdAB5AHAAZQA9ACIANQAiACAAdgBhAGwAdQBlAD0AIgBJAHQAZQBtACIAIAAvAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIAVgBpAGUAdwAiACAAdAB5AHAAZQA9ACIAMAAiACAAdgBhAGwAdQBlAD0AIgAiACAALwA+AA0ACgA8AC8AcgBvAG8AdAA+AA=="

Dit is de tweede:
"99": "//48AD8AeABtAGwAIAB2AGUAcgBzAGkAbwBuAD0AIgAxAC4AMAAiACAAZQBuAGMAbwBkAGkAbgBnAD0AIgBVAFQARgAtADEANgAiACAAcwB0AGEAbgBkAGEAbABvAG4AZQA9ACIAbgBvACIAPwA+AA0ACgA8AHIAbwBvAHQAIAB4AG0AbABuAHMAPQAiAHUAcgBuADoAbQBpAGMAcgBvAHMAbwBmAHQALQBkAHkAbgBhAG0AaQBjAHMALQBuAGEAdgAvAHgAbQBsAHAAbwByAHQAcwAvAHgANgAxADUAMAA3ADAAMAAiAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIATABvAG8AawB1AHAAVAB5AHAAZQAiACAAdAB5AHAAZQA9ACIANQAiACAAdgBhAGwAdQBlAD0AIgBJAHQAZQBtACIAIAAvAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIAVgBpAGUAdwAiACAAdAB5AHAAZQA9ACIAMAAiACAAdgBhAGwAdQBlAD0AIgBBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQACIAIAAvAD4ADQAKADwALwByAG8AbwB0AD4A"

VOOR
Code:
'<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
'- <root xmlns="urn:microsoft-dynamics-nav/xmlports/x6150700">
'  <param action="LOOKUP" name="LookupType" type="5" value="Item" />
'  <param action="LOOKUP" name="View" type="0" value="ABCDEFGHIJKLMNOP" />
'  </root>

NA
Code:
'<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
'- <root xmlns="urn:microsoft-dynamics-nav/xmlports/x6150700">
'  <param action="LOOKUP" name="LookupType" type="5" value="Item" />
'  <param action="LOOKUP" name="View" type="0" value="ABCDEFG" />
'  </root>

Dit is de derde:
"99": "//48AD8AeABtAGwAIAB2AGUAcgBzAGkAbwBuAD0AIgAxAC4AMAAiACAAZQBuAGMAbwBkAGkAbgBnAD0AIgBVAFQARgAtADEANgAiACAAcwB0AGEAbgBkAGEAbABvAG4AZQA9ACIAbgBvACIAPwA+AA0ACgA8AHIAbwBvAHQAIAB4AG0AbABuAHMAPQAiAHUAcgBuADoAbQBpAGMAcgBvAHMAbwBmAHQALQBkAHkAbgBhAG0AaQBjAHMALQBuAGEAdgAvAHgAbQBsAHAAbwByAHQAcwAvAHgANgAxADUAMAA3ADAAMAAiAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIATABvAG8AawB1AHAAVAB5AHAAZQAiACAAdAB5AHAAZQA9ACIANQAiACAAdgBhAGwAdQBlAD0AIgBJAHQAZQBtACIAIAAvAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIAVgBpAGUAdwAiACAAdAB5AHAAZQA9ACIAMAAiACAAdgBhAGwAdQBlAD0AIgAiACAALwA+AA0ACgA8AC8AcgBvAG8AdAA+AA=="

VOOR:
Code:
'<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
'- <root xmlns="urn:microsoft-dynamics-nav/xmlports/x6150700">
'  <param action="LOOKUP" name="LookupType" type="5" value="Item" />
'  <param action="LOOKUP" name="View" type="0" value="" />
'  </root>

NA:
Code:
'<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
'- <root xmlns="urn:microsoft-dynamics-nav/xmlports/x6150700">
'  <param action="LOOKUP" name="LookupType" type="5" value="Item" />
'  <param action="LOOKUP" name="View" type="0" value="Sorting(Description) Order(Ascending) Where(Item Category Code=FILTER(HFDG2), Product Group Code=FILTER(SBG2-2))" />
'  </root>
 
Kijk eens of dit jou bevalt: i.c de vervanging van A .. P door A .. G
Code:
//48AD8AeABtAGwAIAB2AGUAcgBzAGkAbwBuAD0AIgAxAC4AMAAiACAAZQBuAGMAbwBkAGkAbgBnAD0AIgBVAFQARgAtADEANgAiACAAcwB0AGEAbgBkAGEAbABvAG4AZQA9ACIAbgBvACIAPwA+AA0ACgA8AHIAbwBvAHQAIAB4AG0AbABuAHMAPQAiAHUAcgBuADoAbQBpAGMAcgBvAHMAbwBmAHQALQBkAHkAbgBhAG0AaQBjAHMALQBuAGEAdgAvAHgAbQBsAHAAbwByAHQAcwAvAHgANgAxADUAMAA3ADAAMAAiAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIATABvAG8AawB1AHAAVAB5AHAAZQAiACAAdAB5AHAAZQA9ACIANQAiACAAdgBhAGwAdQBlAD0AIgBJAHQAZQBtACIAIAAvAD4ADQAKACAAIAA8AHAAYQByAGEAbQAgAGEAYwB0AGkAbwBuAD0AIgBMAE8ATwBLAFUAUAAiACAAbgBhAG0AZQA9ACIAVgBpAGUAdwAiACAAdAB5AHAAZQA9ACIAMAAiACAAdgBhAGwAdQBlAD0AIgBBAEIAQwBEAEUARgBHACIAIAAvAD4ADQAKADwALwByAG8AbwB0AD4A
 
PERFECT.

Kun je mij uitleggen hoe je dat hebt gedaan en hoe ik hier eventueel VBA code voor kan schrijven voor in Excel?
 
Met code tot de kern van de zaak in plaats van knippen en plakken ;)
Pas het pad aan naar je json-file, de code laat msgboxen zien met je gedecodeerde base64-xml-strings uit key "99"
Code:
[SIZE=1]Option Explicit

Public Sub JSONtoBASE64()
    Dim strJSONFile As String
    Dim strJSONText As String
    Dim strBASE64 As String
    Dim objJSON As Object
    Dim objRecord As Object
    On Error Resume Next    'dirty
    strJSONFile = "E:\Users\user name\Documents\worksheet helpmij\POS Menu - SALE-LEFT Package.json"
    strJSONText = Mid(CreateObject("Scripting.FileSystemObject").OpenTextFile(strJSONFile, 1).ReadAll, 4) 'skip hidden leading UTF-8 signature
    With CreateObject("ScriptControl")
        .Language = "JScript"
        Set objJSON = .Eval("(" & strJSONText & ")").Data
        For Each objRecord In objJSON
            strBASE64 = CallByName(CallByName(objRecord, "Fields", VbGet), "99", VbGet)
            With CreateObject("MSXML2.DOMDocument").CreateElement("base64") 'decode base64
                .DataType = "bin.base64"
                .text = strBASE64
                MsgBox Mid(.nodeTypedValue, 2) 'skip leading ?
            End With
        Next
        Set objJSON = Nothing
    End With
End Sub[/SIZE]
 
Laatst bewerkt:
@alphamax
Ik krijg niets te zien. Moet ik nog speciale verwijzingen aanzetten?
 
Nee, de createobject verwijzen naar standaard dll's die altijd aan staan.
Heb je het pad aangepast?
Getest met windows7en32bit en excel2007nl.
 
Ok. Ik gebruik Excel 2016 nl - 64bit en Windows 10, 64bit.
Het pad heb ik inderdaad aangepast.
 
Werkt het wel als office in 32bit is geinstalleerd maar windows in 64bit?
 
Zonder jscript, dit zou moeten werken.
Code:
[SIZE=1]Public Sub JSONtoBASE64_2()
    Dim strJSONFile As String
    Dim avntJSONs As Variant
    Dim avntJSON As Variant
    Dim strBASE64 As String
        strJSONFile = "E:\Users\user name\Documents\worksheet helpmij\POS Menu - SALE-LEFT Package.json"
        avntJSONs = Split(Mid(CreateObject("Scripting.FileSystemObject").OpenTextFile(strJSONFile, 1).ReadAll, 4), vbCrLf)    'skip hidden leading UTF-8 signature
        For iavntJSONs = 0 To UBound(avntJSONs)
            avntJSON = Split(avntJSONs(iavntJSONs), ":")
            If Trim(avntJSON(0)) = """99""" Then
                strBASE64 = Trim(avntJSON(1))    'trim leading/trailing spaces
                strBASE64 = Mid(strBASE64, 2, Len(strBASE64) - 2)    'trim leading/trailing quotes
                With CreateObject("MSXML2.DOMDocument").CreateElement("base64")    'decode base64
                    .DataType = "bin.base64"
                    .text = strBASE64
                    MsgBox Mid(.nodeTypedValue, 2)    'skip leading ?
                End With
            End If
        Next
End Sub[/SIZE]
 
Werkt perfect. Thanks!
Heb je deze code ook de andere kant op?
Dus van xml naar base64? Er dan vanuit gaande dat de xml in cel A1 staat?
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan