Strukturen kann man anscheinend nicht als Parameter an eine Prozedur übergeben.
Daher habe ich mir gedacht, mache ich das per Makro. Ist auch kein Problem. Nun
würde ich mir gerne eine "kleine" Sourceverkleinerung gönnen. Dazu müsste ich es
eigentlich nur schaffen (auch über Umwege, völlig egal) den Strukur-Parameter für
ExtractJSONStructure() per variable übergeben zu können.
Ich bastel an einem Parser, der aus einer JSON Zeile die Aktionen ausliest und weiterverarbeitet.
Es sind mehr als 50 dieser möglichen "Events". Diese Events sind auch in der jeweiligen Zeile präsent.
Bsp.:
Code: Alles auswählen
{ "timestamp":"2017-08-16T14:35:44Z", "event":"ReceiveText", .....
Momentan behelfe ich mich mit
Code: Alles auswählen
Structure jsonl_receivetext
From.s
From_Localised.s
Message.s
Message_Localised.s
Channel.s
EndStructure
Structure jsonl_rebootrepair
List Modules.s()
EndStructure
Macro getjsonl(Struktur)
*Mem = AllocateStructure(Struktur)
ExtractJSONStructure(jV, *Mem, Struktur)
EndMacro
Procedure.i JL_ReceiveText(*Mem.jsonl_receivetext)
If *Mem
Debug *Mem\Message
FreeStructure(*Mem)
EndIf
EndProcedure
Procedure.i JL_RebootRepair(*Mem.jsonl_rebootrepair)
If *Mem
ForEach *Mem\Modules()
Debug *Mem\Modules()
Next
FreeStructure(*Mem)
EndIf
EndProcedure
Procedure.i ParseString(jString.s)
Protected *Mem, jSon, jV, TimeStamp.s, Event.s
jSon = ParseJSON(#PB_Any, jString, #PB_JSON_NoCase)
If jSon
jV = JSONValue(jSon)
TimeStamp = GetJSONString(GetJSONMember(jV, "timestamp"))
Event = Trim(LCase(GetJSONString(GetJSONMember(jV, "event"))))
Select Event
Case "receivetext"
getjsonl(jsonl_receivetext)
JL_ReceiveText(*Mem)
Case "rebootrepair"
getjsonl(jsonl_rebootrepair)
JL_RebootRepair(*Mem)
EndSelect
FreeJSON(jSon)
EndIf
EndProcedure
Klappt auch wunderbar. Mir schwebt da eine evt. Erleichterung mit Maps vor.
Den Prozeduraufruf kann ich per Prototype proto_Proc(*Mem) variabel gestalten.
Nun müsste ich nur dem Makro per "Variable" mitteilen, dass die bestimmte Struktur
genommen werden soll.
Wie kann ich sowas anstellen ?
Mir schwebt da sowas in der Art vor :
Code: Alles auswählen
Prototype proto_Proc(*Mem)
Structure jsonl_receivetext
From.s
From_Localised.s
Message.s
Message_Localised.s
Channel.s
EndStructure
Structure jsonl_rebootrepair
List Modules.s()
EndStructure
Structure testmap
ProcAufruf.proto_Proc
Strukturname.s ; ???
EndStructure
Global NewMap Aufruf.testmap()
Procedure.i JL_ReceiveText(*Mem.jsonl_receivetext)
If *Mem
Debug *Mem\Message
FreeStructure(*Mem)
EndIf
EndProcedure
Procedure.i JL_RebootRepair(*Mem.jsonl_rebootrepair)
If *Mem
ForEach *Mem\Modules()
Debug *Mem\Modules()
Next
FreeStructure(*Mem)
EndIf
EndProcedure
Aufruf("receivetext")\ProcAufruf = @JL_ReceiveText()
Aufruf("receivetext")\Strukturname = "jsonl_receivetext"
Macro getjsonl(Struktur) ; Wie kann ich den Inhalt der Variable Aufruf("receivetext")\Strukturname hier übernehmen ?
*Mem = AllocateStructure(Struktur)
ExtractJSONStructure(jV, *Mem, Struktur)
Aufruf(Event)\ProcAufruf(*Mem)
EndMacro
Procedure.i ParseString(jString.s)
Protected *Mem, jSon, jV, TimeStamp.s, Event.s
jSon = ParseJSON(#PB_Any, jString, #PB_JSON_NoCase)
If jSon
jV = JSONValue(jSon)
TimeStamp = GetJSONString(GetJSONMember(jV, "timestamp"))
Event = Trim(LCase(GetJSONString(GetJSONMember(jV, "event"))))
getjsonl(????)
FreeJSON(jSon)
EndIf
EndProcedure
Makrobau oder sonst irgendein Trick ?