Beide Varianten funktionieren in einem Modul:
Code: Alles auswählen
DeclareModule Pack
Enumeration
#MAP_ABC
#MAP_NUM
EndEnumeration
Structure Maps
type.i
Map abc.s()
Map num.i()
EndStructure
Macro StoreJSON(MapName)
If CreateJSON(0)
InsertJSONMap(JSONValue(0), MapName)
Debug ComposeJSON(0, #PB_JSON_PrettyPrint)
EndIf
EndMacro
Declare AddJSONMap(Pack.i, PackedName.s, *Map.Maps)
EndDeclareModule
Module Pack
Procedure AddJSONMap(Pack.i, PackedName.s, *Map.Maps)
Define.i JSON, Size
Define *Buffer
JSON = CreateJSON(#PB_Any)
If JSON
Select *Map\type
Case #MAP_ABC: InsertJSONMap(JSONValue(JSON), *Map\abc())
Case #MAP_NUM: InsertJSONMap(JSONValue(JSON), *Map\num())
EndSelect
Debug ComposeJSON(JSON, #PB_JSON_PrettyPrint)
Size = ExportJSONSize(JSON)
*Buffer = AllocateMemory(Size)
If *Buffer
If ExportJSON(JSON, *Buffer, Size)
AddPackMemory(Pack, *Buffer, Size, PackedName)
EndIf
FreeMemory(*Buffer)
EndIf
FreeJSON(JSON)
EndIf
EndProcedure
EndModule
; ---
NewMap num.i()
num("1") = 1
num("3") = 2
num("4") = 3
Define maps.Pack::Maps
maps\type = Pack::#MAP_ABC
maps\abc("a") = "A"
maps\abc("b") = "B"
maps\abc("c") = "C"
Pack::StoreJSON(num())
Pack::AddJSONMap(0, "Pack", maps)
Das Makro ist die universelle Lösung, dem du wirklich jede Map übergeben kannst, was in deinem Fall sinnvoller erscheint wenn du ein allgemeingültiges Modul schreibst. Die Wrapperstruktur wäre mehr etwas für spezifisches Projekt, in dem es nur eine Hand voll festgelegter Maps geben kann.
Du kannst auch eine Kombination aus Makro und Prozedur schreiben, im Makro erzeugst du das JSON und fügst die Map ein, dann übergibst du innerhalb des Makros das JSON an eine Prozedur, die den Rest erledigt.