Hi AspirinJunkie , hi liebe Mitlesende 👋 .
Ich könnte die Frage auch via GitHub issues stellen, doch zum einen passiert hier ja sonst nicht viel 😅 und zum anderen interessiert es vielleicht noch jemand hier, der nicht auf GitHub aktiv ist (who knows).
Einleitung:
Ab und an mache ich doch mal noch etwas mit AutoIt, neben anderen Sprachen in denen ich beruflich unterwegs bin.
Dann kam deine Meldung zur Performance-Verbesserung deiner JSON.au3 UDF und prompt hatte ich mal wieder ein wenig Lust aktiv zu werden 😀 .
Fragestellung:
Warum existiert eigentlich kein "Array to JSON" in der UDF? Vielleicht tut es das (indirekt) und ich habe 🍅 auf den Augen, doch ich fand es vor zwei Wochen nicht.
Also _JSON_Generate verhält sich sicher wie gewünscht, doch entspricht dies nicht dem output JSON string den ich "brauche" #spielerei.
Code (mit Beispieldaten):
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
#include-once
#include "JSON.au3"
_Main()
Func _Main()
Local $aTable[][3] = _
[ _
['Feature', 'Technologie', 'Status'], _
['REST API - User', 'Node.js', 'Fertig'], _
['Datenbank-Migration', 'SQL', 'Geplant'], _
['Frontend Dashboard', 'React', 'Im Review'], _
['Unit Tests - Auth', 'Python', 'In Arbeit'], _
['CI/CD Pipeline', 'GitHub Actions', 'Fertig'], _
['Performance Tuning', 'Go', 'Offen'] _
]
Local $aList[] = _
[ _
'Weekday', _
'Monday', _
'Tuesday', _
'Wednesday', _
'Thursday', _
'Friday', _
'Saturday', _
'Sunday' _
]
_WriteFile('.\output\json-generate-table.json', _JSON_Generate($aTable))
_WriteFile('.\output\array-to-json-table.json', _JSON_Unminify(_ArrayToJson($aTable)) & @CRLF)
_WriteFile('.\output\json-generate-list.json', _JSON_Generate($aList))
_WriteFile('.\output\array-to-json-list.json', _JSON_Unminify(_ArrayToJson($aList)) & @CRLF)
EndFunc
Func _ArrayToJson(ByRef $aTable)
Local $iRows = UBound($aTable)
Local $iColums = UBound($aTable, 2)
If $iRows < 2 Then
Return '[]'
EndIf
If $iColums < 2 Then
Return _Array1DToJson($aTable)
EndIf
Local $aKeys[$iColums]
For $iCol = 0 To $iColums - 1
$aKeys[$iCol] = $aTable[0][$iCol]
Next
Local $sJson = '['
For $iRow = 1 To $iRows - 1
$sJson &= '{'
For $iCol = 0 To $iColums - 1
$sJson &= StringFormat('"%s":"%s"', $aKeys[$iCol], $aTable[$iRow][$iCol])
If $iCol < $iColums - 1 Then
$sJson &= ','
EndIf
Next
$sJson &= '}'
If $iRow < $iRows - 1 Then
$sJson &= ','
EndIf
Next
$sJson &= ']'
Return $sJson
EndFunc
Func _Array1DToJson(ByRef $aList)
Local $iRows = UBound($aList)
If $iRows < 2 Then
Return '{}'
EndIf
Local $sKey = $aList[0]
Local $sJson = StringFormat('{"%s":[', $sKey)
For $iRow = 1 To $iRows - 1
$sJson &= StringFormat('"%s"', $aList[$iRow])
If $iRow < $iRows - 1 Then
$sJson &= ','
EndIf
Next
$sJson &= ']}'
Return $sJson
EndFunc
Func _WriteFile($sFile, $sText)
Local Const $iUtf8NoBom = 256
Local Const $iOverwriteCreation = 2 + 8
Local Const $iMode = $iUtf8NoBom + $iOverwriteCreation
Local $hFile = FileOpen($sFile, $iMode)
FileWrite($hFile, $sText)
FileClose($hFile)
EndFunc
Alles anzeigen
- Schaue dir doch mal bitte die verschiedenen JSON output Dateien an (im Verzeichnis output nach Skriptausführung).
- _JSON_Generate hat einen Zeilen-Fokus (so nenne ich es mal). Somit sind alle Zeilen dann auch JSON arrays.
Jedoch wollte ich einen Spalten-Fokus (erste Spalte Key, erste Zeile dann Value). Erschließt sich besser wenn man es siehst. - Mir ist klar, dass keine nested Array in Array Kombinationen mit _ArrayToJson abgebildet werden können, ist auch gar nicht der Anpruch.
Wäre dies etwas was in die UDF passen würde? Falls ja, dann stelle ich gern den PR dazu, außer du willst es ganz anders - wie ich dich kenne performanter - machen 😇 .
Output:
json-generate-table.json
[
[
"Feature",
"Technologie",
"Status"
],
[
"REST API - User",
"Node.js",
"Fertig"
],
[
"Datenbank-Migration",
"SQL",
"Geplant"
],
[
"Frontend Dashboard",
"React",
"Im Review"
],
[
"Unit Tests - Auth",
"Python",
"In Arbeit"
],
[
"CI/CD Pipeline",
"GitHub Actions",
"Fertig"
],
[
"Performance Tuning",
"Go",
"Offen"
]
]
Alles anzeigen
array-to-json-table.json
[
{
"Feature": "REST API - User",
"Technologie": "Node.js",
"Status": "Fertig"
},
{
"Feature": "Datenbank-Migration",
"Technologie": "SQL",
"Status": "Geplant"
},
{
"Feature": "Frontend Dashboard",
"Technologie": "React",
"Status": "Im Review"
},
{
"Feature": "Unit Tests - Auth",
"Technologie": "Python",
"Status": "In Arbeit"
},
{
"Feature": "CI/CD Pipeline",
"Technologie": "GitHub Actions",
"Status": "Fertig"
},
{
"Feature": "Performance Tuning",
"Technologie": "Go",
"Status": "Offen"
}
]
Alles anzeigen
json-generate-list.json
array-to-json-list.json
Viele Grüße
Sven