JSON Frage... (ExtractJSONStructure)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

JSON Frage... (ExtractJSONStructure)

Beitrag 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 ?
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: JSON Frage... (ExtractJSONStructure)

Beitrag 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.
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: JSON Frage... (ExtractJSONStructure)

Beitrag von #NULL »

backup ist aber kein array aus strings, sondern array aus arrays aus strings.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: JSON Frage... (ExtractJSONStructure)

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: JSON Frage... (ExtractJSONStructure)

Beitrag von Nino »

#NULL hat geschrieben:backup ist aber kein array aus strings, sondern array aus arrays aus strings.
Uups. :oops: 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)
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: JSON Frage... (ExtractJSONStructure)

Beitrag von Bisonte »

:oops: Sorry. Tatsächlich hatte ich das hüpfende Komma zwischen den Backup Pfaden vergessen....

Also Multidimensionales Array. So klappt das ! Danke. :allright:

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 ;)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: JSON Frage... (ExtractJSONStructure) (Gelöst)

Beitrag 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
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: JSON Frage... (ExtractJSONStructure)

Beitrag 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.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: JSON Frage... (ExtractJSONStructure)

Beitrag 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... :allright:
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Antworten