Any JSON to TreeView

Share your advanced PureBasic knowledge/code with the community.
Phollyer
Enthusiast
Enthusiast
Posts: 146
Joined: Sat Jun 03, 2017 3:36 am
Location: USA, Texas
Contact:

Any JSON to TreeView

Post by Phollyer »

So I saw this feature in a Notepad++ Plugin...and thought how difficult can it be? Reading an unknown JSON File into a Control, and parsing into a TreeView...



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

User avatar
idle
Always Here
Always Here
Posts: 5915
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Any JSON to TreeView

Post by idle »

looks useful, though you're missing the DotDotDot1.png and DotDotDotPress.png
maybe they can be created dynamically.
Phollyer
Enthusiast
Enthusiast
Posts: 146
Joined: Sat Jun 03, 2017 3:36 am
Location: USA, Texas
Contact:

Re: Any JSON to TreeView

Post by Phollyer »

Darn! I converted it to a Normal Button...no images needed

Image


Code: Select all

;=====================================================================
;=====
;=====
;=====      System: JsonProject
;=====
;=====   File Name: frmJSONProject.pbi
;=====
;=====      Author: Pete Hollyer
;=====
;=====        Date: 08/20/2025
;=====
;===== Description: This Code is designed to manage the data from Class frm
;=====              to View frm
;=====              It supports the population of Data to form, as well as Creating, 
;=====              Modifying, and Deleting Records.
;=====              
;=====              
;=====              This code generated by ClassBuilder
;=====================================================================
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)

;=============================================
;===  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))
    ButtonGadget(#Gadget_frmMain_BtnImg_File, 780, 25, 35, 24, "File")
    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



Post Reply