Here's The Code, simply launch and load in any JSON file....
Code: Select all
;=====================================================================
;=====
;=====
;===== System: JsonProject
;=====
;=====================================================================
UsePNGImageDecoder()
;=============================================
;=== Window Constants
;=============================================
UsePNGImageDecoder()
;- Window Constants
Enumeration FormWindows 1
#Window_frmMain
EndEnumeration
#WindowIndex=#PB_Compiler_EnumerationValue
;- Window Gadgets
Enumeration #WindowIndex + 1
;-Main.pb
#Gadget_frmMain_Btn_Pretty
#Gadget_frmMain_BtnImg_File
#Gadget_frmMain_Edit_Json
#Gadget_frmMain_Progres_Action
#Gadget_frmMain_Tree_Json
#Gadget_frmMain_Txt_Action
#Gadget_frmMain_Txt_File
#Gadget_frmMain_Txt_JsonFile
#Gadget_frmMain_Font_Default_12
#Gadget_frmMain_Font_Rockwell_12
EndEnumeration
#GadgetIndex=#PB_Compiler_EnumerationValue
;- Image Constants
Enumeration #GadgetIndex + 1
#Gadget_frmMain_Imag_DotDotDot1
#Gadget_frmMain_Imag_DotDotDotPress
EndEnumeration
#ImageIndex=#PB_Compiler_EnumerationValue
;- LoadFonts
LoadFont(#Gadget_frmMain_Font_Default_12, "", 12)
LoadFont(#Gadget_frmMain_Font_Rockwell_12, "Rockwell", 12)
;- CatchImages
CatchImage(#Gadget_frmMain_Imag_DotDotDot1, ?Gadget_frmMain_Imag_DotDotDot1)
CatchImage(#Gadget_frmMain_Imag_DotDotDotPress, ?Gadget_frmMain_Imag_DotDotDotPress)
DataSection
Gadget_frmMain_Imag_DotDotDot1: : IncludeBinary "D:\Development\PBProjects\JsonProject\Images\GUI\DotDotDot1.png"
Gadget_frmMain_Imag_DotDotDotPress: : IncludeBinary "D:\Development\PBProjects\JsonProject\Images\GUI\DotDotDotPress.png"
EndDataSection
;=============================================
;=== Window
;=============================================
Procedure Open_Window_frmMain(X = 0, Y = 0, Width = 1075, Height = 695)
If OpenWindow(#Window_frmMain, X, Y, Width, Height, "The Json Project", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_Invisible | #PB_Window_ScreenCentered)
TextGadget(#Gadget_frmMain_Txt_JsonFile, 130, 5, 120, 22, "JSON File: ", #PB_Text_Right)
SetGadgetFont(#Gadget_frmMain_Txt_JsonFile, FontID(#Gadget_frmMain_Font_Rockwell_12))
TextGadget(#Gadget_frmMain_Txt_File, 255, 5, 520, 25, "", #PB_Text_Right | #PB_Text_Border)
SetGadgetColor(#Gadget_frmMain_Txt_File, #PB_Gadget_BackColor, RGB(242, 242, 242))
SetGadgetFont(#Gadget_frmMain_Txt_File, FontID(#Gadget_frmMain_Font_Rockwell_12))
ButtonImageGadget(#Gadget_frmMain_BtnImg_File, 780, 5, 35, 24, ImageID(#Gadget_frmMain_Imag_DotDotDot1))
SetGadgetAttribute(#Gadget_frmMain_BtnImg_File, #PB_Button_PressedImage, ImageID(#Gadget_frmMain_Imag_DotDotDotPress))
TextGadget(#Gadget_frmMain_Txt_Action, 10, 35, 145, 22, "Loading File: ", #PB_Text_Right)
SetGadgetFont(#Gadget_frmMain_Txt_Action, FontID(#Gadget_frmMain_Font_Rockwell_12))
ProgressBarGadget(#Gadget_frmMain_Progres_Action, 160, 35, 190, 20, 0, 100)
SetGadgetState(#Gadget_frmMain_Progres_Action, 66)
ButtonGadget(#Gadget_frmMain_Btn_Pretty, 410, 50, 100, 30, "Pretty", #PB_Button_Toggle)
SetGadgetFont(#Gadget_frmMain_Btn_Pretty, FontID(#Gadget_frmMain_Font_Rockwell_12))
EditorGadget(#Gadget_frmMain_Edit_Json, 0, 80, 550, 610)
AddGadgetItem(#Gadget_frmMain_Edit_Json, -1, "Editor Line 1")
AddGadgetItem(#Gadget_frmMain_Edit_Json, -1, "Editor Line 2")
AddGadgetItem(#Gadget_frmMain_Edit_Json, -1, "Editor Line 3")
SetGadgetFont(#Gadget_frmMain_Edit_Json, FontID(#Gadget_frmMain_Font_Default_12))
TreeGadget(#Gadget_frmMain_Tree_Json, 555, 80, 520, 610, #PB_Tree_AlwaysShowSelection)
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, "Node", 0, 0)
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, "Sub-element", 0, 1)
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, "Element", 0, 0)
SetGadgetItemState(#Gadget_frmMain_Tree_Json, 0, #PB_Tree_Expanded)
SetGadgetFont(#Gadget_frmMain_Tree_Json, FontID(#Gadget_frmMain_Font_Rockwell_12))
ProcedureReturn #True
EndIf
EndProcedure
;=============================================
;=== Json Project Code
;=============================================
Structure Fields
ID.i
Level.i
Name.s
Type.s
Parent.i
IsParent.b
EndStructure
Enumeration JsonProject #ImageIndex+1
#JSONFile
EndEnumeration
Global NName$=""
NewList JList.Fields()
Procedure AddToList(Level, Name$, Type$, ID, Parent, IsParent=#False )
Protected X, Y, Found
Shared JList()
For X = 0 To ListSize(JList())-1
SelectElement(JList() , X)
If JList()\Level = Level And
JList()\Name = Name$
Found=#True
Break
EndIf
Next
If Not Found
LastElement(JList())
AddElement(JList())
JList()\ID = ID
JList()\Level = Level
JList()\Name = Name$
JList()\Type = Type$
JList()\Parent = Parent
JList()\IsParent = IsParent
EndIf
EndProcedure
Define Name$, Parent
Procedure JsonMembers(ObjValue, Tab.s, Level, ID, Parent)
Protected i, X, JType, JMember, Sub, Rec
Shared Name$
JType = JSONType(ObjValue)
ID + 1
Select Jtype
Case #PB_JSON_Null
AddToList(Level, Name$, "NULL", ID, Parent)
NName$ + " : " + " = Null"
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, NName$, 0, Level)
SetGadgetItemData(#Gadget_frmMain_Tree_Json, CountGadgetItems(#Gadget_frmMain_Tree_Json)-1, ObjValue)
Case #PB_JSON_String
AddToList(Level, Name$, "STRING", ID, Parent)
NName$ + " : " + #DOUBLEQUOTE$ + GetJSONString(ObjValue)+ #DOUBLEQUOTE$
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, NName$, 0, Level)
SetGadgetItemData(#Gadget_frmMain_Tree_Json, CountGadgetItems(#Gadget_frmMain_Tree_Json)-1, ObjValue)
Case #PB_JSON_Number
AddToList(Level, Name$, "NUMBER", ID, Parent)
NName$ + " : " + StrD(GetJSONDouble(ObjValue))
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, NName$, 0, Level)
SetGadgetItemData(#Gadget_frmMain_Tree_Json, CountGadgetItems(#Gadget_frmMain_Tree_Json)-1, ObjValue)
Case #PB_JSON_Boolean
AddToList(Level, NName$, "BOOL", ID, Parent)
NName$ + " : " + Str(GetJSONBoolean(ObjValue))
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, NName$, 0, Level)
SetGadgetItemData(#Gadget_frmMain_Tree_Json, CountGadgetItems(#Gadget_frmMain_Tree_Json)-1, ObjValue)
Case #PB_JSON_Array
AddToList(Level, NName$, "", ID, Parent, #True)
NName$ + "()"
Name$=""
Parent = ID
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, NName$, 0, Level)
SetGadgetItemData(#Gadget_frmMain_Tree_Json, CountGadgetItems(#Gadget_frmMain_Tree_Json)-1, ObjValue)
Sub=0
Rec=0
For i = 0 To JSONArraySize(ObjValue) - 1
Rec + 1
ID+1
;Name$=GetJSONElement(ObjValue, i)
AddGadgetItem(#Gadget_frmMain_Tree_Json, -1, "Item "+Str(Rec), 0, Level+1)
JsonMembers(GetJSONElement(ObjValue, i), Tab, Level+1+Sub, ID, Parent)
Next i
Case #PB_JSON_Object
X = JSONObjectSize(ObjValue)
Tab + " "
Level + 1
Sub = 0
;Parent = Parent +1
ExamineJSONMembers(ObjValue)
While NextJSONMember(ObjValue)
ID+1
JMember = GetJSONMember(ObjValue, JSONMemberKey(ObjValue) )
Name$ = JSONMemberKey(ObjValue)
NName$ = JSONMemberKey(ObjValue)
JsonMembers(JMember, Tab, Level, ID, Parent)
Wend
EndSelect
EndProcedure
Procedure BuildTree(JSON)
Protected X, Y, i, JValue, JType, JMember
Shared JList(),Name$
ClearGadgetItems(#Gadget_frmMain_Tree_Json)
JValue = JSONValue(JSON)
JType = JSONType(JValue)
Select Jtype
Case #PB_JSON_Object
X = JSONObjectSize(JValue)
ExamineJSONMembers(JValue)
While NextJSONMember(JValue)
NName$ = JSONMemberKey(JValue)
Name$=NName$
JMember = GetJSONMember(JValue, JSONMemberKey(JValue) )
JsonMembers(JMember, " ", 0, 0, 0)
Wend
EndSelect
EndProcedure
;======================================================
;=== ShowForm
;======================================================
Define String$, x, y, w, h, ID, Format, File$, Current$, *ScintText
Define EventID, MenuID, GadgetID, WindowID, Index, FSize.f, Size.f, Text$
Define quitfrmMain
;Define Gadget.Gadget
quitfrmMain = #False
If Open_Window_frmMain()
SetActiveWindow(#Window_frmMain)
HideGadget(#Gadget_frmMain_Txt_Action, #True)
HideGadget(#Gadget_frmMain_Progres_Action, #True)
SetGadgetState(#Gadget_frmMain_Progres_Action, 0)
;Set Screen Data
HideWindow(#Window_frmMain, #False)
Repeat
EventID = WaitWindowEvent()
MenuID = EventMenu()
GadgetID = EventGadget()
WindowID = EventWindow()
Select EventID
Case #PB_Event_CloseWindow
Select WindowID
Case #Window_frmMain
quitfrmMain = #True
EndSelect
Case #PB_Event_Menu
Select MenuID
EndSelect
Case #PB_Event_Gadget
Select GadgetID
Case #Gadget_frmMain_BtnImg_File
Select EventType()
Case #PB_EventType_LeftClick
If Current$ = ""
Current$ = GetCurrentDirectory()
EndIf
File$ = OpenFileRequester("Please select a JSON file to load", Current$, "JSON Files (*.json)|*.json", 0)
If File$
SetGadgetText(#Gadget_frmMain_Txt_File, File$)
Text$ = ""
If IsJSON(#JSONFile)
FreeJSON(#JSONFile)
EndIf
HideGadget(#Gadget_frmMain_Txt_Action, #False)
HideGadget(#Gadget_frmMain_Progres_Action, #False)
SetGadgetState(#Gadget_frmMain_Progres_Action, 0)
FSize = FileSize(File$)
FSize = 100.0 / FSize
Size = 0
If ReadFile(0, File$)
Format = ReadStringFormat(0)
While Eof(0) = 0
Text$ = Text$ + ReadString(0, Format)
Size = Len(Text$)
SetGadgetState(#Gadget_frmMain_Progres_Action, Size*FSize)
While WindowEvent() : Wend
Wend
CloseFile(0)
SetGadgetState(#Gadget_frmMain_Progres_Action, 100)
While WindowEvent() : Wend
ParseJSON(#JSONFile, Text$)
;Load into Editor
SetGadgetText(#Gadget_frmMain_Edit_Json, "")
If IsJSON(#JSONFile)
BuildTree(#JSONFile)
If GetGadgetState(#Gadget_frmMain_Btn_Pretty)
SetGadgetText(#Gadget_frmMain_Edit_Json, ComposeJSON(#JSONFile, #PB_JSON_PrettyPrint))
Else
SetGadgetText(#Gadget_frmMain_Edit_Json, ComposeJSON(#JSONFile))
EndIf
EndIf
HideGadget(#Gadget_frmMain_Txt_Action, #True)
HideGadget(#Gadget_frmMain_Progres_Action, #True)
SetGadgetState(#Gadget_frmMain_Progres_Action, 0)
Else
MessageRequester("JSON Project", "Couldn't open the selected file!")
EndIf
EndIf
EndSelect
Case #Gadget_frmMain_Btn_Pretty
Select EventType()
Case #PB_EventType_LeftClick
If GetGadgetState(#Gadget_frmMain_Btn_Pretty)
If IsJSON(#JSONFile)
SetGadgetText(#Gadget_frmMain_Edit_Json, "")
SetGadgetText(#Gadget_frmMain_Edit_Json, ComposeJSON(#JSONFile, #PB_JSON_PrettyPrint))
EndIf
Else
If IsJSON(#JSONFile)
SetGadgetText(#Gadget_frmMain_Edit_Json, "")
SetGadgetText(#Gadget_frmMain_Edit_Json, ComposeJSON(#JSONFile))
EndIf
EndIf
EndSelect
EndSelect
EndSelect
Until quitfrmMain = #True
CloseWindow(#Window_frmMain)
EndIf
End