Seite 1 von 1
JSON Frage... (ExtractJSONStructure)
Verfasst: 27.10.2018 03:37
von Bisonte
Ich habe hier ein JSON Konstrukt, dass ich mit ExtractJSONStructure() auslesen möchte :
Code: Alles auswählen
{"files": ["d:\text1.txt","d:\text2.txt"], "backup": [["d:\backup1.txt"]["d:\backup2.txt"]]}
Wie genau muss die Struktur dafür aussehen ?
Code: Alles auswählen
Structure s_files
List Files.s()
; wie bekomme ich "backup" ?
Probiert habe ich :
Array backup.s(10)
backup.s[10]
List backup.s()
Map backup.s()
brachte alles nichts...
Kann mir da jemand auf die Sprünge helfen ?
Re: JSON Frage... (ExtractJSONStructure)
Verfasst: 27.10.2018 04:17
von Nino
Bisonte hat geschrieben:Ich habe hier ein JSON Konstrukt, dass ich mit ExtractJSONStructure() auslesen möchte :
Code: Alles auswählen
{"files": ["d:\text1.txt","d:\text2.txt"], "backup": [["d:\backup1.txt"]["d:\backup2.txt"]]}
Das sind keine validen JSON-Daten.
Wenn folgendes gemeint ist:
{"files": ["d:\text1.txt","d:\text2.txt"], "backup": [["d:\backup1.txt"]
,["d:\backup2.txt"]]}
dann kannst Du
Code: Alles auswählen
Structure Json
Array files$(0)
Array backup$(1)
EndStructure
benutzen. Listen statt Arrays geht auch.
Re: JSON Frage... (ExtractJSONStructure)
Verfasst: 27.10.2018 10:04
von #NULL
backup ist aber kein array aus strings, sondern array aus arrays aus strings.
Re: JSON Frage... (ExtractJSONStructure)
Verfasst: 27.10.2018 10:16
von STARGÅTE
Doch das geht, aber halt mit mehrdimensionalen Arrays und wie schon gesagt, muss die JSON richtig formatiert sein:
Code: Alles auswählen
Structure MyStruc
Array files.s(0)
Array backup.s(0,0)
EndStructure
Define Text.s = ~"{\"files\": [\"d:\\\\text1.txt\",\"d:\\\\text2.txt\"], \"backup\": [[\"d:\\\\backup1.txt\"],[\"d:\\\\backup2.txt\"]]}"
Define MyStruc.MyStruc
If ParseJSON(1, Text)
ExtractJSONStructure(JSONValue(1), @MyStruc, MyStruc)
Debug MyStruc\files(0)
Debug MyStruc\files(1)
Debug MyStruc\backup(0,0)
Debug MyStruc\backup(1,0)
EndIf
Re: JSON Frage... (ExtractJSONStructure)
Verfasst: 27.10.2018 11:00
von Nino
#NULL hat geschrieben:backup ist aber kein array aus strings, sondern array aus arrays aus strings.
Uups.

Das kommt davon, wenn man morgens um kurz nach 4 Uhr Fragen beantworten will ...
STARGÅTE war nun schneller mit der richtigen Antwort.
Zu beachten ist hier außerdem, dass jeder Backslash escaped werden muss, auch wenn man die herkömmliche String-Syntax verwendet (deshalb bei STARGÅTE jeweils 4x '\'):
Code: Alles auswählen
input$ = "{'files': ['d:\\text1.txt','d:\\text2.txt'], 'backup': [['d:\\backup1.txt'],['d:\\backup2.txt']]}"
ReplaceString(input$, "'", Chr(34), #PB_String_InPlace)
Re: JSON Frage... (ExtractJSONStructure)
Verfasst: 27.10.2018 11:48
von Bisonte

Sorry. Tatsächlich hatte ich das hüpfende Komma zwischen den Backup Pfaden vergessen....
Also Multidimensionales Array. So klappt das ! Danke.
Das mit den Escapen ist klar...

Mir ging es nur um den Dateityp.
Da es eine Externe Anwendung ist, kann ich leider daran nichts drehen... und es steht noch viel mehr in dem json file....
daher ist das mit ExtractJSONStructure() seeeeehr angenehm

Re: JSON Frage... (ExtractJSONStructure) (Gelöst)
Verfasst: 27.10.2018 19:38
von Bisonte
Nun hab ich da aber ein neues Problem :
Der Code von Stargate funktioniert eigentlich tadellos. Nur wenn keine Einträge bei Backup vorhanden sind,
gibt es einen Division by Zero Error.
Code: Alles auswählen
Structure MyStruc
Array files.s(0)
Array backup.s(0,0)
EndStructure
Define Text.s = ~"{\"files\": [\"d:\\\\text1.txt\",\"d:\\\\text2.txt\"], \"backup\": []}"
Define MyStruc.MyStruc
If ParseJSON(1, Text)
ExtractJSONStructure(JSONValue(1), @MyStruc, MyStruc)
Debug MyStruc\files(0)
Debug MyStruc\files(1)
maxBackup = ArraySize(MyStruc\backup(), 1)
maxFile = ArraySize(MyStruc\backup(), 2)
For i = 0 To maxBackup
For j = 0 To maxFile
Debug MyStruc\backup(i,j)
Next j
Next i
EndIf
Wie kann ich diesen Fehler umgehen, bzw. wie kann ich vorher herrausfinden, ob sich dort was befindet oder nicht ?
Edit :
Habs gefunden : JSONArraySize() war mein vermisster Freund
Code: Alles auswählen
Structure MyStruc
Array files.s(0)
Array backup.s(0,0)
EndStructure
Define Text.s = ~"{\"files\": [\"d:\\\\text1.txt\",\"d:\\\\text2.txt\"], \"backup\": []}"
Define MyStruc.MyStruc
If ParseJSON(1, Text)
ExtractJSONStructure(JSONValue(1), @MyStruc, MyStruc)
Debug MyStruc\files(0)
Debug MyStruc\files(1)
If JSONArraySize(GetJSONMember(JSONValue(1), "backup")) > 0
maxBackup = ArraySize(MyStruc\backup(), 1)
maxFile = ArraySize(MyStruc\backup(), 2)
For i = 0 To maxBackup
For j = 0 To maxFile
Debug MyStruc\backup(i,j)
Next j
Next i
EndIf
EndIf
Re: JSON Frage... (ExtractJSONStructure)
Verfasst: 27.10.2018 20:04
von Nino
Folgendes scheint zu funktionieren:
Zunächst die
zweite Dimension mit ArraySize() prüfen.
Wenn das Ergebnis -1 ist, ist das Array leer.
So funktioniert dein Code hier mit PB 5.70 beta 2 unter Windows:
Code: Alles auswählen
Structure MyStruc
Array files.s(0)
Array backup.s(0,0)
EndStructure
Define Text.s = ~"{\"files\": [\"d:\\\\text1.txt\",\"d:\\\\text2.txt\"], \"backup\": []}"
Define MyStruc.MyStruc
If ParseJSON(1, Text)
ExtractJSONStructure(JSONValue(1), @MyStruc, MyStruc)
Debug MyStruc\files(0)
Debug MyStruc\files(1)
maxFile = ArraySize(MyStruc\backup(), 2)
If maxFile > -1
maxBackup = ArraySize(MyStruc\backup(), 1)
For i = 0 To maxBackup
For j = 0 To maxFile
Debug MyStruc\backup(i,j)
Next j
Next i
EndIf
EndIf
//Edit: Ah, du hast es inzwischen anders gelöst.
Re: JSON Frage... (ExtractJSONStructure)
Verfasst: 27.10.2018 21:03
von Bisonte
Nino hat geschrieben://Edit: Ah, du hast es inzwischen anders gelöst.
Deine Methode finde ich allerdings eleganter, da man dann auf das jsonmember raussuchen verzichten kann...
und ich die ArraySize Abfrage ja trotzdem dabeihaben muss...
