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. :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)

Re: JSON Frage... (ExtractJSONStructure)

Verfasst: 27.10.2018 11:48
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 ;)

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... :allright: