Jump to content

Recommended Posts

Posted

I have this JSON...

{
  "space_max": 109521666048,
  "space_used": 81029420875,
  "code": 200,
  "timestamp": "2021-11-07 13:08:18",
  "id": 72245322,
  "name": "",
  "parent_id": -1,
  "folders": [
    {
      "id": 190445888,
      "name": "Projects",
      "size": 1241090652,
      "last_update": "2021-10-08 10:02:55"
    },
    {
      "id": 190502134,
      "name": "Backup",
      "size": 2104404044,
      "last_update": "2021-10-08 17:39:41"
    }
  ],
  "files": [],
  "result": true
}

I'm using Ward's JSON UDF.

; ============================================================================================================================
; File      : Json.au3 (2018.12.29)
; Purpose   : A Non-Strict JavaScript Object Notation (JSON) Parser UDF
; Author    : Ward
; Dependency: BinaryCall.au3
; Website   : http://www.json.org/index.html
;
; Source    : jsmn.c
; Author    : zserge
; Website   : http://zserge.com/jsmn.html
;
; Source    : json_string_encode.c, json_string_decode.c
; Author    : Ward
;             Jos - Added Json_Dump()
;             TheXMan - Json_ObjGetItems and some Json_Dump Fixes.
;             Jos - Changed Json_ObjGet() and Json_ObjExists() to allow for multilevel object in string.
; ============================================================================================================================

; ============================================================================================================================
; Public Functions:
;   Json_StringEncode($String, $Option = 0)
;   Json_StringDecode($String)
;   Json_IsObject(ByRef $Object)
;   Json_IsNull(ByRef $Null)
;   Json_Encode($Data, $Option = 0, $Indent = Default, $ArraySep = Default, $ObjectSep = Default, $ColonSep = Default)
;   Json_Decode($Json, $InitTokenCount = 1000)
;   Json_ObjCreate()
;   Json_ObjPut(ByRef $Object, $Key, $Value)
;   Json_ObjGet(ByRef $Object, $Key)
;   Json_ObjDelete(ByRef $Object, $Key)
;   Json_ObjExists(ByRef $Object, $Key)
;   Json_ObjGetCount(ByRef $Object)
;   Json_ObjGetKeys(ByRef $Object)
;   Json_ObjGetItems(ByRef $Object)
;   Json_ObjClear(ByRef $Object)
;   Json_Put(ByRef $Var, $Notation, $Data, $CheckExists = False)
;   Json_Get(ByRef $Var, $Notation)
;   Json_Dump($String)
; ============================================================================================================================

#include-once
#include "BinaryCall.au3"

; The following constants can be combined to form options for Json_Encode()
Global Const $JSON_UNESCAPED_UNICODE = 1 ; Encode multibyte Unicode characters literally
Global Const $JSON_UNESCAPED_SLASHES = 2 ; Don't escape /
Global Const $JSON_HEX_TAG = 4 ; All < and > are converted to \u003C and \u003E
Global Const $JSON_HEX_AMP = 8 ; All &s are converted to \u0026
Global Const $JSON_HEX_APOS = 16 ; All ' are converted to \u0027
Global Const $JSON_HEX_QUOT = 32 ; All " are converted to \u0022
Global Const $JSON_UNESCAPED_ASCII = 64 ; Don't escape ascii charcters between chr(1) ~ chr(0x1f)
Global Const $JSON_PRETTY_PRINT = 128 ; Use whitespace in returned data to format it
Global Const $JSON_STRICT_PRINT = 256 ; Make sure returned JSON string is RFC4627 compliant
Global Const $JSON_UNQUOTED_STRING = 512 ; Output unquoted string if possible (conflicting with $Json_STRICT_PRINT)

; Error value returnd by Json_Decode()
Global Const $JSMN_ERROR_NOMEM = -1 ; Not enough tokens were provided
Global Const $JSMN_ERROR_INVAL = -2 ; Invalid character inside JSON string
Global Const $JSMN_ERROR_PART = -3 ; The string is not a full JSON packet, more bytes expected
Global $Total_JSON_DUMP_Output = ""

Func __Jsmn_RuntimeLoader($ProcName = "")
    Static $SymbolList
    If Not IsDllStruct($SymbolList) Then
        Local $Code
        If @AutoItX64 Then
            $Code = 'AwAAAAQfCAAAAAAAAAA1HbEvgTNrvX54gCiWSTVmt5v7RCdoFJ/zhkKmwcm8yVqZPjJBoVhNHHAIzrHWKbZh1J0QAUaHB5zyQTilTmWa9O0OKeLrk/Jg+o7CmMzjEk74uPongdHv37nwYXvg97fiHvjP2bBzI9gxSkKq9Cqh/GxSHIlZPYyW76pXUt//25Aqs2Icfpyay/NFd50rW7eMliH5ynkrp16HM1afithVrO+LpSaz/IojowApmXnBHUncHliDqbkx6/AODUkyDm1hj+AiEZ9Me1Jy+hBQ1/wC/YnuuYSJvNAKp6XDnyc8Nwr54Uqx5SbUW2CezwQQ7aXX/HFiHSKpQcFW/gi8oSx5nsoxUXVjxeNI/L7z6GF2mfu3Tnpt7hliWEdA2r2VB+TIM7Pgwl9X3Ge0T3KJQUaRtLJZcPvVtOuKXr2Q9wy7hl80hVRrt9zYrbjBHXLrRx/HeIMkZwxhmKo/dD/vvaNgE+BdU8eeJqFBJK2alrK2rh2WkRynftyepm1WrdKrz/5KhQPp/4PqH+9IADDjoGBbfvJQXdT+yiO8DtfrVnd+JOEKsKEsdgeM3UXx5r6tEHO9rYWbzbnyEiX7WozZemry+vBZMMtHn1aA63+RcDQED73xOsnj00/9E5Z6hszM5Hi8vi6Hw3iOgf3cHwcXG44aau0JpuA2DlrUvnJOYkNnY+bECeSdAR1UQkFNyqRoH2xm4Y7gYMCPsFtPBlwwleEKI27SsUq1ZHVQvFCoef7DXgf/GwPCAvwDMIQfb3hJtIVubOkASRQZVNIJ/y4KPrn/gcASV7fvMjE34loltTVlyqprUWxpI51tN6vhTOLAp+CHseKxWaf9g1wdbVs0e/5xAiqgJbmKNi9OYbhV/blpp3SL63XKxGiHdxhK1aR+4rUY4eckNbaHfW7ob+q7aBoHSs6LVX9lWakb/xWxwQdwcX/7/C+TcQSOOg6rLoWZ8wur9qp+QwzoCbXkf04OYpvD5kqgEiwQnB90kLtcA+2XSbDRu+aq02eNNCzgkZujeL/HjVISjf2EuQKSsZkBhS15eiXoRgPaUoQ5586VS7t7rhM8ng5LiVzoUQIZ0pNKxWWqD+gXRBvOMIXY2yd0Ei4sE5KFIEhbs3u8vwP7nFLIpZ/RembPTuc0ZlguGJgJ2F5iApfia+C2tRYRNjVCqECCveWw6P2Btfaq9gw7cWWmJflIQbjxtccDqsn52cftLqXSna9zk05mYdJSV8z2W7vM1YJ5Rd82v0j3kau710A/kQrN41bdaxmKjL+gvSRlOLB1bpvkCtf9+h+eVA4XIkIXKFydr1OjMZ8wq2FIxPJXskAe4YMgwQmeWZXMK1KBbLB3yQR1YOYaaHk1fNea9KsXgs5YLbiP/noAusz76oEDo/DJh1aw7cUwdhboVPg1bNq88mRb5RGa13KDK9uEET7OA02KbSL+Q4HOtyasLUoVrZzVyd8iZPoGrV36vHnj+yvG4fq6F/fkug/sBRp186yVZQVmdAgFd+WiRLnUjxHUKJ6xBbpt4FTP42E/PzPw3JlDb0UQtXTDnIL0CWqbns2E7rZ5PBwrwQYwvBn/gaEeLVGDSh84DfW4zknIneGnYDXdVEHC+ITzejAnNxb1duB+w2aVTk64iXsKHETq53GMH6DuFi0oUeEFb/xp0HsRyNC8vBjOq3Kk7NZHxCQLh7UATFttG7sH+VIqGjjNwmraGJ0C92XhpQwSgfAb3KHucCHGTTti0sn6cgS3vb36BkjGKsRhXVuoQCFH96bvTYtl8paQQW9ufRfvxPqmU0sALdR0fIvZwd7Z8z0UoEec6b1Sul4e60REj/H4scb6N2ryHBR9ua5N1YxJu1uwgoLXUL2wT9ZPBjPjySUzeqXikUIKKYgNlWy+VlNIiWWTPtKpCTr508logA=='
        Else
            $Code = 'AwAAAASFBwAAAAAAAAA1HbEvgTNrvX54gCiqsa1mt5v7RCdoAFjCfVE40DZbE5UfabA9UKuHrjqOMbvjSoB2zBJTEYEQejBREnPrXL3VwpVOW+L9SSfo0rTfA8U2W+Veqo1uy0dOsPhl7vAHbBHrvJNfEUe8TT0q2eaTX2LeWpyrFEm4I3mhDJY/E9cpWf0A78e+y4c7NxewvcVvAakIHE8Xb8fgtqCTVQj3Q1eso7n1fKQj5YsQ20A86Gy9fz8dky78raeZnhYayn0b1riSUKxGVnWja2i02OvAVM3tCCvXwcbSkHTRjuIAbMu2mXF1UpKci3i/GzPmbxo9n/3aX/jpR6UvxMZuaEDEij4yzfZv7EyK9WCNBXxMmtTp3Uv6MZsK+nopXO3C0xFzZA/zQObwP3zhJ4sdatzMhFi9GAM70R4kgMzsxQDNArueXj+UFzbCCFZ89zXs22F7Ixi0FyFTk3jhH56dBaN65S+gtPztNGzEUmtk4M8IanhQSw8xCXr0x0MPDpDFDZs3aN5TtTPYmyk3psk7OrmofCQGG5cRcqEt9902qtxQDOHumfuCPMvU+oMjzLzBVEDnBbj+tY3y1jvgGbmEJguAgfB04tSeAt/2618ksnJJK+dbBkDLxjB4xrFr3uIFFadJQWUckl5vfh4MVXbsFA1hG49lqWDa7uSuPCnOhv8Yql376I4U4gfcF8LcgorkxS+64urv2nMUq6AkBEMQ8bdkI64oKLFfO7fGxh5iMNZuLoutDn2ll3nq4rPi4kOyAtfhW0UPyjvqNtXJ/h0Wik5Mi8z7BVxaURTDk81TP8y9+tzjySB/uGfHFAzjF8DUY1vqJCgn0GQ8ANtiiElX/+Wnc9HWi2bEEXItbm4yv97QrEPvJG9nPRBKWGiAQsIA5J+WryX5NrfEfRPk0QQwyl16lpHlw6l0UMuk7S21xjQgyWo0MywfzoBWW7+t4HH9sqavvP4dYAw81BxXqVHQhefUOS23en4bFUPWE98pAN6bul+kS767vDK34yTC3lA2a8wLrBEilmFhdB74fxbAl+db91PivhwF/CR4Igxr35uLdof7+jAYyACopQzmsbHpvAAwT2lapLix8H03nztAC3fBqFSPBVdIv12lsrrDw4dfhJEzq7AbL/Y7L/nIcBsQ/3UyVnZk4kZP1KzyPCBLLIQNpCVgOLJzQuyaQ6k2QCBy0eJ0ppUyfp54LjwVg0X7bwncYbAomG4ZcFwTQnC2AX3oYG5n6Bz4SLLjxrFsY+v/SVa+GqH8uePBh1TPkHVNmzjXXymEf5jROlnd+EjfQdRyitkjPrg2HiQxxDcVhCh5J2L5+6CY9eIaYgrbd8zJnzAD8KnowHwh2bi4JLgmt7ktJ1XGizox7cWf3/Dod56KAcaIrSVw9XzYybdJCf0YRA6yrwPWXbwnzc/4+UDkmegi+AoCEMoue+cC7vnYVdmlbq/YLE/DWJX383oz2Ryq8anFrZ8jYvdoh8WI+dIugYL2SwRjmBoSwn56XIaot/QpMo3pYJIa4o8aZIZrjvB7BXO5aCDeMuZdUMT6AXGAGF1AeAWxFd2XIo1coR+OplMNDuYia8YAtnSTJ9JwGYWi2dJz3xrxsTQpBONf3yn8LVf8eH+o5eXc7lzCtHlDB+YyI8V9PyMsUPOeyvpB3rr9fDfNy263Zx33zTi5jldgP2OetUqGfbwl+0+zNYnrg64bluyIN/Awt1doDCQkCKpKXxuPaem/SyCHrKjg'
        EndIf

        Local $Symbol[] = ["jsmn_parse", "jsmn_init", "json_string_decode", "json_string_encode"]
        Local $CodeBase = _BinaryCall_Create($Code)
        If @error Then Exit MsgBox(16, "Json", "Startup Failure!")

        $SymbolList = _BinaryCall_SymbolList($CodeBase, $Symbol)
        If @error Then Exit MsgBox(16, "Json", "Startup Failure!")
    EndIf
    If $ProcName Then Return DllStructGetData($SymbolList, $ProcName)
EndFunc   ;==>__Jsmn_RuntimeLoader

Func Json_StringEncode($String, $Option = 0)
    Static $Json_StringEncode = __Jsmn_RuntimeLoader("json_string_encode")
    Local $Length = StringLen($String) * 6 + 1
    Local $Buffer = DllStructCreate("wchar[" & $Length & "]")
    Local $Ret = DllCallAddress("int:cdecl", $Json_StringEncode, "wstr", $String, "ptr", DllStructGetPtr($Buffer), "uint", $Length, "int", $Option)
    Return SetError($Ret[0], 0, DllStructGetData($Buffer, 1))
EndFunc   ;==>Json_StringEncode

Func Json_StringDecode($String)
    Static $Json_StringDecode = __Jsmn_RuntimeLoader("json_string_decode")
    Local $Length = StringLen($String) + 1
    Local $Buffer = DllStructCreate("wchar[" & $Length & "]")
    Local $Ret = DllCallAddress("int:cdecl", $Json_StringDecode, "wstr", $String, "ptr", DllStructGetPtr($Buffer), "uint", $Length)
    Return SetError($Ret[0], 0, DllStructGetData($Buffer, 1))
EndFunc   ;==>Json_StringDecode

Func Json_Decode($Json, $InitTokenCount = 1000)
    Static $Jsmn_Init = __Jsmn_RuntimeLoader("jsmn_init"), $Jsmn_Parse = __Jsmn_RuntimeLoader("jsmn_parse")
    If $Json = "" Then $Json = '""'
    Local $TokenList, $Ret
    Local $Parser = DllStructCreate("uint pos;int toknext;int toksuper")
    Do
        DllCallAddress("none:cdecl", $Jsmn_Init, "ptr", DllStructGetPtr($Parser))
        $TokenList = DllStructCreate("byte[" & ($InitTokenCount * 20) & "]")
        $Ret = DllCallAddress("int:cdecl", $Jsmn_Parse, "ptr", DllStructGetPtr($Parser), "wstr", $Json, "ptr", DllStructGetPtr($TokenList), "uint", $InitTokenCount)
        $InitTokenCount *= 2
    Until $Ret[0] <> $JSMN_ERROR_NOMEM

    Local $Next = 0
    Return SetError($Ret[0], 0, _Json_Token($Json, DllStructGetPtr($TokenList), $Next))
EndFunc   ;==>Json_Decode

Func _Json_Token(ByRef $Json, $Ptr, ByRef $Next)
    If $Next = -1 Then Return Null

    Local $Token = DllStructCreate("int;int;int;int", $Ptr + ($Next * 20))
    Local $Type = DllStructGetData($Token, 1)
    Local $Start = DllStructGetData($Token, 2)
    Local $End = DllStructGetData($Token, 3)
    Local $Size = DllStructGetData($Token, 4)
    $Next += 1

    If $Type = 0 And $Start = 0 And $End = 0 And $Size = 0 Then ; Null Item
        $Next = -1
        Return Null
    EndIf

    Switch $Type
        Case 0 ; Json_PRIMITIVE
            Local $Primitive = StringMid($Json, $Start + 1, $End - $Start)
            Switch $Primitive
                Case "true"
                    Return True
                Case "false"
                    Return False
                Case "null"
                    Return Null
                Case Else
                    If StringRegExp($Primitive, "^[+\-0-9]") Then
                        Return Number($Primitive)
                    Else
                        Return Json_StringDecode($Primitive)
                    EndIf
            EndSwitch

        Case 1 ; Json_OBJECT
            Local $Object = Json_ObjCreate()
            For $i = 0 To $Size - 1 Step 2
                Local $Key = _Json_Token($Json, $Ptr, $Next)
                Local $Value = _Json_Token($Json, $Ptr, $Next)
                If Not IsString($Key) Then $Key = Json_Encode($Key)

                If $Object.Exists($Key) Then $Object.Remove($Key)
                $Object.Add($Key, $Value)
            Next
            Return $Object

        Case 2 ; Json_ARRAY
            Local $Array[$Size]
            For $i = 0 To $Size - 1
                $Array[$i] = _Json_Token($Json, $Ptr, $Next)
            Next
            Return $Array

        Case 3 ; Json_STRING
            Return Json_StringDecode(StringMid($Json, $Start + 1, $End - $Start))
    EndSwitch
EndFunc   ;==>_Json_Token

Func Json_IsObject(ByRef $Object)
    Return (IsObj($Object) And ObjName($Object) = "Dictionary")
EndFunc   ;==>Json_IsObject

Func Json_IsNull(ByRef $Null)
    Return IsKeyword($Null) Or (Not IsObj($Null) And VarGetType($Null) = "Object")
EndFunc   ;==>Json_IsNull

Func Json_Encode_Compact($Data, $Option = 0)
    Local $Json = ""

    Select
        Case IsString($Data)
            Return '"' & Json_StringEncode($Data, $Option) & '"'

        Case IsNumber($Data)
            Return $Data

        Case IsArray($Data) And UBound($Data, 0) = 1
            $Json = "["
            For $i = 0 To UBound($Data) - 1
                $Json &= Json_Encode_Compact($Data[$i], $Option) & ","
            Next
            If StringRight($Json, 1) = "," Then $Json = StringTrimRight($Json, 1)
            Return $Json & "]"

        Case Json_IsObject($Data)
            $Json = "{"
            Local $Keys = $Data.Keys()
            For $i = 0 To UBound($Keys) - 1
                $Json &= '"' & Json_StringEncode($Keys[$i], $Option) & '":' & Json_Encode_Compact($Data.Item($Keys[$i]), $Option) & ","
            Next
            If StringRight($Json, 1) = "," Then $Json = StringTrimRight($Json, 1)
            Return $Json & "}"

        Case IsBool($Data)
            Return StringLower($Data)

        Case IsPtr($Data)
            Return Number($Data)

        Case IsBinary($Data)
            Return '"' & Json_StringEncode(BinaryToString($Data, 4), $Option) & '"'

        Case Else ; Keyword, DllStruct, Object
            Return "null"
    EndSelect
EndFunc   ;==>Json_Encode_Compact

Func Json_Encode_Pretty($Data, $Option, $Indent, $ArraySep, $ObjectSep, $ColonSep, $ArrayCRLF = Default, $ObjectCRLF = Default, $NextIdent = "")
    Local $ThisIdent = $NextIdent, $Json = "", $String = "", $Match = "", $Keys = ""
    Local $Length = 0

    Select
        Case IsString($Data)
            $String = Json_StringEncode($Data, $Option)
            If BitAND($Option, $JSON_UNQUOTED_STRING) And Not BitAND($Option, $JSON_STRICT_PRINT) And Not StringRegExp($String, "[\s,:]") And Not StringRegExp($String, "^[+\-0-9]") Then
                Return $String
            Else
                Return '"' & $String & '"'
            EndIf

        Case IsArray($Data) And UBound($Data, 0) = 1
            If UBound($Data) = 0 Then Return "[]"
            If IsKeyword($ArrayCRLF) Then
                $ArrayCRLF = ""
                $Match = StringRegExp($ArraySep, "[\r\n]+$", 3)
                If IsArray($Match) Then $ArrayCRLF = $Match[0]
            EndIf

            If $ArrayCRLF Then $NextIdent &= $Indent
            $Length = UBound($Data) - 1
            For $i = 0 To $Length
                If $ArrayCRLF Then $Json &= $NextIdent
                $Json &= Json_Encode_Pretty($Data[$i], $Option, $Indent, $ArraySep, $ObjectSep, $ColonSep, $ArrayCRLF, $ObjectCRLF, $NextIdent)
                If $i < $Length Then $Json &= $ArraySep
            Next

            If $ArrayCRLF Then Return "[" & $ArrayCRLF & $Json & $ArrayCRLF & $ThisIdent & "]"
            Return "[" & $Json & "]"

        Case Json_IsObject($Data)
            If $Data.Count = 0 Then Return "{}"
            If IsKeyword($ObjectCRLF) Then
                $ObjectCRLF = ""
                $Match = StringRegExp($ObjectSep, "[\r\n]+$", 3)
                If IsArray($Match) Then $ObjectCRLF = $Match[0]
            EndIf

            If $ObjectCRLF Then $NextIdent &= $Indent
            $Keys = $Data.Keys()
            $Length = UBound($Keys) - 1
            For $i = 0 To $Length
                If $ObjectCRLF Then $Json &= $NextIdent
                $Json &= Json_Encode_Pretty(String($Keys[$i]), $Option, $Indent, $ArraySep, $ObjectSep, $ColonSep) & $ColonSep _
                         & Json_Encode_Pretty($Data.Item($Keys[$i]), $Option, $Indent, $ArraySep, $ObjectSep, $ColonSep, $ArrayCRLF, $ObjectCRLF, $NextIdent)
                If $i < $Length Then $Json &= $ObjectSep
            Next

            If $ObjectCRLF Then Return "{" & $ObjectCRLF & $Json & $ObjectCRLF & $ThisIdent & "}"
            Return "{" & $Json & "}"

        Case Else
            Return Json_Encode_Compact($Data, $Option)

    EndSelect
EndFunc   ;==>Json_Encode_Pretty

Func Json_Encode($Data, $Option = 0, $Indent = Default, $ArraySep = Default, $ObjectSep = Default, $ColonSep = Default)
    If BitAND($Option, $JSON_PRETTY_PRINT) Then
        Local $Strict = BitAND($Option, $JSON_STRICT_PRINT)

        If IsKeyword($Indent) Then
            $Indent = @TAB
        Else
            $Indent = Json_StringDecode($Indent)
            If StringRegExp($Indent, "[^\t ]") Then $Indent = @TAB
        EndIf

        If IsKeyword($ArraySep) Then
            $ArraySep = "," & @CRLF
        Else
            $ArraySep = Json_StringDecode($ArraySep)
            If $ArraySep = "" Or StringRegExp($ArraySep, "[^\s,]|,.*,") Or ($Strict And Not StringRegExp($ArraySep, ",")) Then $ArraySep = "," & @CRLF
        EndIf

        If IsKeyword($ObjectSep) Then
            $ObjectSep = "," & @CRLF
        Else
            $ObjectSep = Json_StringDecode($ObjectSep)
            If $ObjectSep = "" Or StringRegExp($ObjectSep, "[^\s,]|,.*,") Or ($Strict And Not StringRegExp($ObjectSep, ",")) Then $ObjectSep = "," & @CRLF
        EndIf

        If IsKeyword($ColonSep) Then
            $ColonSep = ": "
        Else
            $ColonSep = Json_StringDecode($ColonSep)
            If $ColonSep = "" Or StringRegExp($ColonSep, "[^\s,:]|[,:].*[,:]") Or ($Strict And (StringRegExp($ColonSep, ",") Or Not StringRegExp($ColonSep, ":"))) Then $ColonSep = ": "
        EndIf

        Return Json_Encode_Pretty($Data, $Option, $Indent, $ArraySep, $ObjectSep, $ColonSep)

    ElseIf BitAND($Option, $JSON_UNQUOTED_STRING) Then
        Return Json_Encode_Pretty($Data, $Option, "", ",", ",", ":")
    Else
        Return Json_Encode_Compact($Data, $Option)
    EndIf
EndFunc   ;==>Json_Encode

Func Json_ObjCreate()
    Local $Object = ObjCreate('Scripting.Dictionary')
    $Object.CompareMode = 0
    Return $Object
EndFunc   ;==>Json_ObjCreate

Func Json_ObjPut(ByRef $Object, $Key, $Value)
    $Key = String($Key)
    If $Object.Exists($Key) Then $Object.Remove($Key)
    $Object.Add($Key, $Value)
EndFunc   ;==>Json_ObjPut

Func Json_ObjGet(ByRef $Object, $Key)
    Local $DynObject = $Object
    Local $Keys = StringSplit($Key, ".")
    For $x = 1 To $Keys[0]
        If $DynObject.Exists($Keys[$x]) Then
            If $x = $Keys[0] Then
                Return $DynObject.Item($Keys[$x])
            Else
                $DynObject = Json_ObjGet($DynObject, $Keys[$x])
            EndIf
        EndIf
    Next
    Return SetError(1, 0, '')
EndFunc   ;==>Json_ObjGet

Func Json_ObjDelete(ByRef $Object, $Key)
    $Key = String($Key)
    If $Object.Exists($Key) Then $Object.Remove($Key)
EndFunc   ;==>Json_ObjDelete

Func Json_ObjExists(ByRef $Object, $Key)
    Local $DynObject = $Object
    Local $Keys = StringSplit($Key, ".")
    For $x = 1 To $Keys[0]
        If $DynObject.Exists($Keys[$x]) Then
            If $x = $Keys[0] Then
                Return True
            Else
                $DynObject = Json_ObjGet($DynObject, $Keys[$x])
            EndIf
        Else
            Return False
        EndIf
    Next
    Return False
EndFunc   ;==>Json_ObjExists

Func Json_ObjGetCount(ByRef $Object)
    Return $Object.Count
EndFunc   ;==>Json_ObjGetCount

Func Json_ObjGetKeys(ByRef $Object)
    Return $Object.Keys()
EndFunc   ;==>Json_ObjGetKeys

Func Json_ObjGetItems(ByRef $Object)
    Return $Object.Items()
EndFunc   ;==>Json_ObjGetItems

Func Json_ObjClear(ByRef $Object)
    Return $Object.RemoveAll()
EndFunc   ;==>Json_ObjClear

; Both dot notation and square bracket notation can be supported
Func Json_Put(ByRef $Var, $Notation, $Data, $CheckExists = False)
    Local $Ret = 0, $Item = "", $Error = 0
    Local $Match = ""

    $Match = StringRegExp($Notation, "(^\[([^\]]+)\])|(^\.([^\.\[]+))", 3)
    If IsArray($Match) Then
        Local $Index
        If UBound($Match) = 4 Then
            $Index = String(Json_Decode($Match[3])) ; only string using dot notation
            $Notation = StringTrimLeft($Notation, StringLen($Match[2]))
        Else
            $Index = Json_Decode($Match[1])
            $Notation = StringTrimLeft($Notation, StringLen($Match[0]))
        EndIf

        If IsString($Index) Then
            If $CheckExists And (Not Json_IsObject($Var) Or Not Json_ObjExists($Var, $Index)) Then
                Return SetError(1, 0, False) ; no specific object
            EndIf

            If Not Json_IsObject($Var) Then $Var = Json_ObjCreate()
            If $Notation Then
                $Item = Json_ObjGet($Var, $Index)
                $Ret = Json_Put($Item, $Notation, $Data, $CheckExists)
                $Error = @error
                If Not $Error Then Json_ObjPut($Var, $Index, $Item)
                Return SetError($Error, 0, $Ret)
            Else
                Json_ObjPut($Var, $Index, $Data)
                Return True
            EndIf

        ElseIf IsInt($Index) Then
            If $Index < 0 Or ($CheckExists And (Not IsArray($Var) Or UBound($Var, 0) <> 1 Or $Index >= UBound($Var))) Then
                Return SetError(1, 0, False) ; no specific object
            EndIf

            If Not IsArray($Var) Or UBound($Var, 0) <> 1 Then
                Dim $Var[$Index + 1]
            ElseIf $Index >= UBound($Var) Then
                ReDim $Var[$Index + 1]
            EndIf

            If $Notation Then
                $Ret = Json_Put($Var[$Index], $Notation, $Data, $CheckExists)
                Return SetError(@error, 0, $Ret)
            Else
                $Var[$Index] = $Data
                Return True
            EndIf

        EndIf
    EndIf
    Return SetError(2, 0, False) ; invalid notation
EndFunc   ;==>Json_Put

; Both dot notation and square bracket notation can be supported
Func Json_Get(ByRef $Var, $Notation)
    Local $Match = StringRegExp($Notation, "(^\[([^\]]+)\])|(^\.([^\.\[]+))", 3)
    If IsArray($Match) Then
        Local $Index
        If UBound($Match) = 4 Then
            $Index = String(Json_Decode($Match[3])) ; only string using dot notation
            $Notation = StringTrimLeft($Notation, StringLen($Match[2]))
        Else
            $Index = Json_Decode($Match[1])
            $Notation = StringTrimLeft($Notation, StringLen($Match[0]))
        EndIf

        Local $Item
        If IsString($Index) And Json_IsObject($Var) And Json_ObjExists($Var, $Index) Then
            $Item = Json_ObjGet($Var, $Index)
        ElseIf IsInt($Index) And IsArray($Var) And UBound($Var, 0) = 1 And $Index >= 0 And $Index < UBound($Var) Then
            $Item = $Var[$Index]
        Else
            Return SetError(1, 0, "") ; no specific object
        EndIf

        If Not $Notation Then Return $Item
        Local $Ret = Json_Get($Item, $Notation)
        Return SetError(@error, 0, $Ret)
    EndIf
    Return SetError(2, 0, "") ; invalid notation
EndFunc   ;==>Json_Get

; List all JSON keys and their value to the Console
Func Json_Dump($Json, $InitTokenCount = 1000)
    Static $Jsmn_Init = __Jsmn_RuntimeLoader("jsmn_init"), $Jsmn_Parse = __Jsmn_RuntimeLoader("jsmn_parse")
    If $Json = "" Then $Json = '""'
    Local $TokenList, $Ret
    $Total_JSON_DUMP_Output = ""  ; reset totaldump variable at the start of the dump process (Use for testing)
    Local $Parser = DllStructCreate("uint pos;int toknext;int toksuper")
    Do
        DllCallAddress("none:cdecl", $Jsmn_Init, "ptr", DllStructGetPtr($Parser))
        $TokenList = DllStructCreate("byte[" & ($InitTokenCount * 20) & "]")
        $Ret = DllCallAddress("int:cdecl", $Jsmn_Parse, "ptr", DllStructGetPtr($Parser), "wstr", $Json, "ptr", DllStructGetPtr($TokenList), "uint", $InitTokenCount)
        $InitTokenCount *= 2
    Until $Ret[0] <> $JSMN_ERROR_NOMEM

    Local $Next = 0
    _Json_TokenDump($Json, DllStructGetPtr($TokenList), $Next)
EndFunc   ;==>Json_Dump

Func _Json_TokenDump(ByRef $Json, $Ptr, ByRef $Next, $ObjPath = "")
    If $Next = -1 Then Return Null

    Local $Token = DllStructCreate("int;int;int;int", $Ptr + ($Next * 20))
    Local $Type = DllStructGetData($Token, 1)
    Local $Start = DllStructGetData($Token, 2)
    Local $End = DllStructGetData($Token, 3)
    Local $Size = DllStructGetData($Token, 4)
    Local $Value
    $Next += 1

    If $Type = 0 And $Start = 0 And $End = 0 And $Size = 0 Then ; Null Item
        $Next = -1
        Return Null
    EndIf

    Switch $Type
        Case 0 ; Json_PRIMITIVE
            Local $Primitive = StringMid($Json, $Start + 1, $End - $Start)
            Switch $Primitive
                Case "true"
                    Return "True"
                Case "false"
                    Return "False"
                Case "null"
                    Return "Null"
                Case Else
                    If StringRegExp($Primitive, "^[+\-0-9]") Then
                        Return Number($Primitive)
                    Else
                        Return Json_StringDecode($Primitive)
                    EndIf
            EndSwitch

        Case 1 ; Json_OBJECT
            For $i = 0 To $Size - 1 Step 2
                Local $Key = _Json_TokenDump($Json, $Ptr, $Next)
                Local $cObjPath = $ObjPath & "." & $Key
                $Value = _Json_TokenDump($Json, $Ptr, $Next, $ObjPath & "." & $Key)
                If Not (IsBool($Value) And $Value = False) Then
                    If Not IsString($Key) Then
                        $Key = Json_Encode($Key)
                    EndIf
                    ; show the key and its value
                    ConsoleWrite("+-> " & $cObjPath & '  =' & $Value & @CRLF)
                    $Total_JSON_DUMP_Output &= "+-> " & $cObjPath & '  =' & $Value & @CRLF
                EndIf
            Next
            Return False
        Case 2 ; Json_ARRAY
            Local $sObjPath = $ObjPath
            For $i = 0 To $Size - 1
                $sObjPath = $ObjPath & "[" & $i & "]"
                $Value = _Json_TokenDump($Json, $Ptr, $Next, $sObjPath)
                If Not (IsBool($Value) And $Value = False) Then ;XC - Changed line
                    ; show the key and its value
                    ConsoleWrite("+=> " & $sObjPath & "=>" & $Value & @CRLF)
                    $Total_JSON_DUMP_Output &= "+=> " & $sObjPath & "=>" & $Value & @CRLF
                EndIf
            Next
            $ObjPath = $sObjPath
            Return False

        Case 3 ; Json_STRING
            Local $LastKey = Json_StringDecode(StringMid($Json, $Start + 1, $End - $Start))
            Return $LastKey
    EndSwitch
EndFunc   ;==>_Json_TokenDump

Which Requires the BinaryCall UDF...

; =============================================================================
;  AutoIt BinaryCall UDF (2014.7.24)
;  Purpose: Allocate, Decompress, And Prepare Binary Machine Code
;  Author: Ward
; =============================================================================

#Include-once

Global $__BinaryCall_Kernel32dll = DllOpen('kernel32.dll')
Global $__BinaryCall_Msvcrtdll = DllOpen('msvcrt.dll')
Global $__BinaryCall_LastError = ""

Func _BinaryCall_GetProcAddress($Module, $Proc)
    Local $Ret = DllCall($__BinaryCall_Kernel32dll, 'ptr', 'GetProcAddress', 'ptr', $Module, 'str', $Proc)
    If @Error Or Not $Ret[0] Then Return SetError(1, @Error, 0)
    Return $Ret[0]
EndFunc

Func _BinaryCall_LoadLibrary($Filename)
    Local $Ret = DllCall($__BinaryCall_Kernel32dll, "handle", "LoadLibraryW", "wstr", $Filename)
    If @Error Then Return SetError(1, @Error, 0)
    Return $Ret[0]
EndFunc

Func _BinaryCall_lstrlenA($Ptr)
    Local $Ret = DllCall($__BinaryCall_Kernel32dll, "int", "lstrlenA", "ptr", $Ptr)
    If @Error Then Return SetError(1, @Error, 0)
    Return $Ret[0]
EndFunc

Func _BinaryCall_Alloc($Code, $Padding = 0)
    Local $Length = BinaryLen($Code) + $Padding
    Local $Ret = DllCall($__BinaryCall_Kernel32dll, "ptr", "VirtualAlloc", "ptr", 0, "ulong_ptr", $Length, "dword", 0x1000, "dword", 0x40)
    If @Error Or Not $Ret[0] Then Return SetError(1, @Error, 0)
    If BinaryLen($Code) Then
        Local $Buffer = DllStructCreate("byte[" & $Length & "]", $Ret[0])
        DllStructSetData($Buffer, 1, $Code)
    EndIf
    Return $Ret[0]
EndFunc

Func _BinaryCall_RegionSize($Ptr)
    Local $Buffer = DllStructCreate("ptr;ptr;dword;uint_ptr;dword;dword;dword")
    Local $Ret = DllCall($__BinaryCall_Kernel32dll, "int", "VirtualQuery", "ptr", $Ptr, "ptr", DllStructGetPtr($Buffer), "uint_ptr", DllStructGetSize($Buffer))
    If @Error Or $Ret[0] = 0 Then Return SetError(1, @Error, 0)
    Return DllStructGetData($Buffer, 4)
EndFunc

Func _BinaryCall_Free($Ptr)
    Local $Ret = DllCall($__BinaryCall_Kernel32dll, "bool", "VirtualFree", "ptr", $Ptr, "ulong_ptr", 0, "dword", 0x8000)
    If @Error Or $Ret[0] = 0 Then
        $Ret = DllCall($__BinaryCall_Kernel32dll, "bool", "GlobalFree", "ptr", $Ptr)
        If @Error Or $Ret[0] <> 0 Then Return SetError(1, @Error, False)
    EndIf
    Return True
EndFunc

Func _BinaryCall_Release($CodeBase)
    Local $Ret = _BinaryCall_Free($CodeBase)
    Return SetError(@Error, @Extended, $Ret)
EndFunc

Func _BinaryCall_MemorySearch($Ptr, $Length, $Binary)
    Static $CodeBase
    If Not $CodeBase Then
        If @AutoItX64 Then
            $CodeBase = _BinaryCall_Create('0x4883EC084D85C94889C8742C4C39CA72254C29CA488D141131C9EB0848FFC14C39C97414448A1408453A140874EE48FFC04839D076E231C05AC3', '', 0, True, False)
        Else
            $CodeBase = _BinaryCall_Create('0x5589E58B4D14578B4508568B550C538B7D1085C9742139CA721B29CA8D341031D2EB054239CA740F8A1C17381C1074F34039F076EA31C05B5E5F5DC3', '', 0, True, False)
        EndIf
        If Not $CodeBase Then Return SetError(1, 0, 0)
    EndIf

    $Binary = Binary($Binary)
    Local $Buffer = DllStructCreate("byte[" & BinaryLen($Binary) & "]")
    DllStructSetData($Buffer, 1, $Binary)

    Local $Ret = DllCallAddress("ptr:cdecl", $CodeBase, "ptr", $Ptr, "uint", $Length, "ptr", DllStructGetPtr($Buffer), "uint", DllStructGetSize($Buffer))
    Return $Ret[0]
EndFunc

Func _BinaryCall_Base64Decode($Src)
    Static $CodeBase
    If Not $CodeBase Then
        If @AutoItX64 Then
            $CodeBase = _BinaryCall_Create('0x41544989CAB9FF000000555756E8BE000000534881EC000100004889E7F3A44C89D6E98A0000004439C87E0731C0E98D0000000FB66E01440FB626FFC00FB65E020FB62C2C460FB62424408A3C1C0FB65E034189EB41C1E4024183E3308A1C1C41C1FB044509E34080FF634189CC45881C08744C440FB6DFC1E5044489DF4088E883E73CC1FF0209C7418D44240241887C08014883C10380FB63742488D841C1E3064883C60483E03F4409D841884408FF89F389C84429D339D30F8C67FFFFFF4881C4000100005B5E5F5D415CC35EC3E8F9FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E0000003F3435363738393A3B3C3D00000063000000000102030405060708090A0B0C0D0E0F101112131415161718190000000000001A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233', '', 132, True, False)
        Else
            $CodeBase = _BinaryCall_Create('0x55B9FF00000089E531C05756E8F10000005381EC0C0100008B55088DBDF5FEFFFFF3A4E9C00000003B45140F8FC20000000FB65C0A028A9C1DF5FEFFFF889DF3FEFFFF0FB65C0A038A9C1DF5FEFFFF889DF2FEFFFF0FB65C0A018985E8FEFFFF0FB69C1DF5FEFFFF899DECFEFFFF0FB63C0A89DE83E630C1FE040FB6BC3DF5FEFFFFC1E70209FE8B7D1089F3881C074080BDF3FEFFFF63745C0FB6B5F3FEFFFF8BBDECFEFFFF8B9DE8FEFFFF89F083E03CC1E704C1F80209F88B7D1088441F0189D883C00280BDF2FEFFFF6374278A85F2FEFFFFC1E60683C10483E03F09F088441F0289D883C0033B4D0C0F8C37FFFFFFEB0231C081C40C0100005B5E5F5DC35EC3E8F9FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E0000003F3435363738393A3B3C3D00000063000000000102030405060708090A0B0C0D0E0F101112131415161718190000000000001A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233', '', 132, True, False)
        EndIf
        If Not $CodeBase Then Return SetError(1, 0, Binary(""))
    EndIf

    $Src = String($Src)
    Local $SrcLen = StringLen($Src)
    Local $SrcBuf = DllStructCreate("char[" & $SrcLen & "]")
    DllStructSetData($SrcBuf, 1, $Src)

    Local $DstLen = Int(($SrcLen + 2) / 4) * 3 + 1
    Local $DstBuf = DllStructCreate("byte[" & $DstLen & "]")

    Local $Ret = DllCallAddress("uint:cdecl", $CodeBase, "ptr", DllStructGetPtr($SrcBuf), "uint", $SrcLen, "ptr", DllStructGetPtr($DstBuf), "uint", $DstLen)
    If $Ret[0] = 0 Then Return SetError(2, 0, Binary(""))
    Return BinaryMid(DllStructGetData($DstBuf, 1), 1, $Ret[0])
EndFunc

Func _BinaryCall_Base64Encode($Src)
    Static $CodeBase
    If Not $CodeBase Then
        If @AutoItX64 Then
            $CodeBase = _BinaryCall_Create('AwAAAARiAQAAAAAAAAArkuFQDAlvIp0qAgbDnjr76UDZs1EPNIP2K18t9s6SNTbd43IB7HfdyPM8VfD/o36z4AmSW2m2AIsC6Af3fKNsHU4BdQKGd0PQXHxPSX0iNqp1YAKovksqQna06NeKMoOYqryTUX4WgpHjokhp6zY2sEFSIjcL7dW3FDoNVz4bGPyZHRvjFwmqvr7YGlNYKwNoh+SYCXmIgVPVZ63Vz1fbT33/QFpWmWOeBRqs4J+c8Qp6zJFsK345Pjw0I8kMSsnho4F4oNzQ2OsAbmIioaQ6Ma2ziw5NH+M+t4SpEeHDnBdUTTL20sxWZ0yKruFAsBIRoHvM7LYcid2eBV2d5roSjnkwMG0g69LNjs1fHjbI/9iU/hJwpSsgl4fltXdZG659/li13UFY89M7UfckiZ9XOeBM0zadgNsy8r8M3rEAAA==')
        Else
            $CodeBase = _BinaryCall_Create('AwAAAARVAQAAAAAAAAAqr7blBndrIGnmhhfXD7R1fkOTKhicg1W6MCtStbz+CsneBEg0bbHH1sqTLmLfY7A6LqZl6LYWT5ULVj6MXgugPbBn9wKsSU2ZCcBBPNkx09HVPdUaKnbqghDGj/C5SHoF+A/5g+UgE1C5zJZORjJ8ljs5lt2Y9lA4BsY7jVKX2vmDvHK1NnSR6nVwh7Pb+Po/UpNcy5sObVWDKkYSCCtCIjKIYqOe3c6k8Xsp4eritCUprXEVvCFi7K5Z6HFXdm3nZsFcE+eSJ1WkRnVQbWcmpjGMGka61C68+CI7tsQ13UnCFWNSpDrCbzUejMZh8HdPgEc5vCg3pKMKin/NavNpB6+87Y9y7HIxmKsPdjDT30u9hUKWnYiRe3nrwKyVDsiYpKU/Nse368jHag5B5or3UKA+nb2+eY8JwzgA')
        EndIf
        If Not $CodeBase Then Return SetError(1, 0, Binary(""))
    EndIf

    $Src = Binary($Src)
    Local $SrcLen = BinaryLen($Src)
    Local $SrcBuf = DllStructCreate("byte[" & $SrcLen & "]")
    DllStructSetData($SrcBuf, 1, $Src)

    Local $DstLen = Int(($SrcLen + 2) / 3) * 4 + 1
    Local $DstBuf = DllStructCreate("char[" & $DstLen & "]")

    Local $Ret = DllCallAddress("uint:cdecl", $CodeBase, "ptr", DllStructGetPtr($SrcBuf), "uint", $SrcLen, "ptr", DllStructGetPtr($DstBuf), "uint", $DstLen)
    If $Ret[0] = 0 Then Return Binary("")
    Return StringMid(DllStructGetData($DstBuf, 1), 1, $Ret[0])
EndFunc

Func _BinaryCall_LzmaDecompress($Src)
    Static $CodeBase
    If Not $CodeBase Then
        If @AutoItX64 Then
            $CodeBase = _BinaryCall_Create(_BinaryCall_Base64Decode('QVcxwEFWQVVBVFVXSInXVkiJzlMx20iB7OgAAABEiiFBgPzgdgnpyQAAAEGD7C1BiMf/wEGA/Cx38THA6wRBg+wJQYjG/8BBgPwId/GLRglEi24FQQ+2zkyJRCQoRQ+2/0HB5xBBiQFBD7bEAcG4AAMAANPgjYQAcA4AAEhjyOjIBAAATInpSInF6L0EAABIicMxwEyJ8kSI4EyLRCQoiNQl//8A/0QJ+EiF24lFAHQoTYXtdCNIjVfzSI1MJDhIg8YNTIkEJE2J6UmJ2EiJ7+g2AAAAicbrBb4BAAAASInp6IQEAACF9nQKSInZMdvodgQAAEiJ2EiBxOgAAABbXl9dQVxBXUFeQV/DVVNBV0FWQVVBVEFQTQHBQVFNicVRVkgB8lJIieX8SYn0iwdMjX8Eik8Cg8r/0+L30olV6Ijhg8r/0+L30olV5ADBiUXsuAEAAACJReCJRdyJRdhIiUXQRSnJKfaDy/8A0bgAAwAA0+BIjYg2BwAAuAAEAARMif/R6fOrvwUAAADoUAMAAP/PdfdEie9EicgrfSDB4ARBifpEI1XoRAHQTY0cR+hAAwAAD4WTAAAAik3sI33k0+eA6Qj22dPuAfe4AQAAAEiNPH++AAEAAMHnCEGD+QdNjbR/bA4AAHI0TInvSCt90A+2P9HnQYnzIf5BAfNPjRxe6O8CAACJwcHuCIPhATnOvgABAAB1DjnGd9jrDE2J8+jQAgAAOfBy9EyJ76pEiclBg/kEcg65AwAAAEGD+QpyA4PBA0EpyelDAgAAT42cT4ABAADomgIAAHUsi0XcQYP5B4lF4BnAi1XY99CLTdCD4AOJVdxBicGJTdhNjbdkBgAA6akAAABPjZxPmAEAAOhfAgAAdUZEicjB4AREAdBNjZxH4AEAAOhHAgAAdWpBg/kHuQkAAAByA4PBAkGJyUyJ70grfdBIO30gD4L9AQAAigdIA33QqumzAQAAT42cT7ABAADoCgIAAIt12HQhT42cT8gBAADo+AEAAIt13HQJi03ci3XgiU3gi03YiU3ci03QiU3YiXXQQYP5B7kIAAAAcgODwQNBiclNjbdoCgAATYnz6LsBAAB1FESJ0CnJweADvggAAABJjXxGBOs2TY1eAuicAQAAdRpEidC5CAAAAMHgA74IAAAASY28RgQBAADrEUmNvgQCAAC5EAAAAL4AAQAAiU3MuAEAAABJifvoYQEAAInCKfJy8gNVzEGD+QSJVcwPg7kAAABBg8EHuQMAAAA50XICidHB4Qa4AQAAAEmNvE9gAwAAvkAAAABJifvoHwEAAEGJwkEp8nLwQYP6BHJ4RInWRIlV0NHug2XQAf/Og03QAkGD+g5zFYnx0mXQi0XQRCnQTY20R14FAADrLIPuBOi6AAAA0evRZdBBOdhyBv9F0EEp2P/OdedNjbdEBgAAwWXQBL4EAAAAvwEAAACJ+E2J8+ioAAAAqAF0Awl90NHn/8516+sERIlV0P9F0EyJ74tNzEiJ+IPBAkgrRSBIOUXQd1RIif5IK3XQSItVGKyqSDnXcwT/yXX1SYn9D7bwTDttGA+C9fz//+gwAAAAKcBIi1UQTCtlCESJIkiLVWBMK20gRIkqSIPEKEFcQV1BXUFfW13DXli4AQAAAOvSgfsAAAABcgHDweMITDtlAHPmQcHgCEWKBCRJg8QBwynATY0cQ4H7AAAAAXMVweMITDtlAHPBQcHgCEWKBCRJg8QBidlBD7cTwekLD6/KQTnIcxOJy7kACAAAKdHB6QVmQQELAcDDKcvB6gVBKchmQSkTAcCDwAHDSLj////////////gbXN2Y3J0LmRsbHxtYWxsb2MASLj////////////gZnJlZQA='))
        Else
            $CodeBase = _BinaryCall_Create(_BinaryCall_Base64Decode('VYnlVzH/VlOD7EyLXQiKC4D54A+HxQAAADHA6wWD6S2I0ID5LI1QAXfziEXmMcDrBYPpCYjQgPkIjVABd/OIReWLRRSITeSLUwkPtsmLcwWJEA+2ReUBwbgAAwAA0+CNhABwDgAAiQQk6EcEAACJNCSJRdToPAQAAItV1InHi0Xkhf+JArgBAAAAdDaF9nQyi0UQg8MNiRQkiXQkFIl8JBCJRCQYjUXgiUQkDItFDIlcJASD6A2JRCQI6CkAAACLVdSJRdSJFCToAQQAAItF1IXAdAqJPCQx/+jwAwAAg8RMifhbXl9dw1dWU1WJ5YtFJAFFKFD8i3UYAXUcVot1FK2SUopO/oPI/9Pg99BQiPGDyP/T4PfQUADRifeD7AwpwEBQUFBQUFcp9laDy/+4AAMAANPgjYg2BwAAuAAEAATR6fOragVZ6MoCAADi+Yt9/ItF8Ct9JCH4iUXosADoywIAAA+FhQAAAIpN9CN97NPngOkI9tnT7lgB916NPH/B5wg8B1qNjH5sDgAAUVa+AAEAAFCwAXI0i338K33cD7Y/i23M0eeJ8SH+AfGNbE0A6JgCAACJwcHuCIPhATnOvgABAAB1DjnwctfrDIttzOh5AgAAOfBy9FqD+gSJ0XIJg/oKsQNyArEGKcpS60mwwOhJAgAAdRRYX1pZWln/NCRRUrpkBgAAsQDrb7DM6CwCAAB1LLDw6BMCAAB1U1g8B7AJcgKwC1CLdfwrddw7dSQPgs8BAACsi338qumOAQAAsNjo9wEAAIt12HQbsOTo6wEAAIt11HQJi3XQi03UiU3Qi03YiU3Ui03ciU3YiXXcWF9ZumgKAACxCAH6Ulc8B4jIcgIEA1CLbczovAEAAHUUi0Xoi33MweADKclqCF6NfEcE6zWLbcyDxQLomwEAAHUYi0Xoi33MweADaghZaghejbxHBAEAAOsQvwQCAAADfcxqEFm+AAEAAIlN5CnAQIn96GYBAACJwSnxcvMBTeSDfcQED4OwAAAAg0XEB4tN5IP5BHIDagNZi33IweEGKcBAakBejbxPYAMAAIn96CoBAACJwSnxcvOJTeiJTdyD+QRyc4nOg2XcAdHug03cAk6D+Q5zGbivAgAAKciJ8dJl3ANF3NHgA0XIiUXM6y2D7gToowAAANHr0WXcOV3gcgb/RdwpXeBOdei4RAYAAANFyIlFzMFl3ARqBF4p/0eJ+IttzOi0AAAAqAF0Awl93NHnTnXs6wD/RdyLTeSDwQKLffyJ+CtFJDlF3HdIif4rddyLVSisqjnXcwNJdfeJffwPtvA7fSgPgnH9///oKAAAACnAjWwkPItVIIt1+Ct1GIkyi1Usi338K30kiTrJW15fw15YKcBA69qB+wAAAAFyAcPB4whWi3X4O3Ucc+SLReDB4AisiUXgiXX4XsOLTcQPtsDB4QQDRegByOsGD7bAA0XEi23IjWxFACnAjWxFAIH7AAAAAXMci0wkOMFkJCAIO0wkXHOcihH/RCQ4weMIiFQkIInZD7dVAMHpCw+vyjlMJCBzF4nLuQAIAAAp0cHpBWYBTQABwI1sJEDDweoFKUwkICnLZilVAAHAg8ABjWwkQMO4///////gbXN2Y3J0LmRsbHxtYWxsb2MAuP//////4GZyZWUA'))
        EndIf
        If Not $CodeBase Then Return SetError(1, 0, Binary(""))
    EndIf

    $Src = Binary($Src)
    Local $SrcLen = BinaryLen($Src)
    Local $SrcBuf = DllStructCreate("byte[" & $SrcLen & "]")
    DllStructSetData($SrcBuf, 1, $Src)

    Local $Ret = DllCallAddress("ptr:cdecl", $CodeBase, "ptr", DllStructGetPtr($SrcBuf), "uint_ptr", $SrcLen, "uint_ptr*", 0, "uint*", 0)
    If $Ret[0] Then
        Local $DstBuf = DllStructCreate("byte[" & $Ret[3] & "]", $Ret[0])
        Local $Output = DllStructGetData($DstBuf, 1)
        DllCall($__BinaryCall_Msvcrtdll, "none:cdecl", "free", "ptr", $Ret[0])

        Return $Output
    EndIf
    Return SetError(2, 0, Binary(""))
EndFunc

Func _BinaryCall_Relocation($Base, $Reloc)
    Local $Size = Int(BinaryMid($Reloc, 1, 2))

    For $i = 3 To BinaryLen($Reloc) Step $Size
        Local $Offset = Int(BinaryMid($Reloc, $i, $Size))
        Local $Ptr = $Base + $Offset
        DllStructSetData(DllStructCreate("ptr", $Ptr), 1, DllStructGetData(DllStructCreate("ptr", $Ptr), 1) + $Base)
    Next
EndFunc

Func _BinaryCall_ImportLibrary($Base, $Length)
    Local $JmpBin, $JmpOff, $JmpLen, $DllName, $ProcName
    If @AutoItX64 Then
        $JmpBin = Binary("0x48B8FFFFFFFFFFFFFFFFFFE0")
        $JmpOff = 2
    Else
        $JmpBin = Binary("0xB8FFFFFFFFFFE0")
        $JmpOff = 1
    EndIf
    $JmpLen = BinaryLen($JmpBin)

    Do
        Local $Ptr = _BinaryCall_MemorySearch($Base, $Length, $JmpBin)
        If $Ptr = 0 Then ExitLoop

        Local $StringPtr = $Ptr + $JmpLen
        Local $StringLen = _BinaryCall_lstrlenA($StringPtr)
        Local $String = DllStructGetData(DllStructCreate("char[" & $StringLen & "]", $StringPtr), 1)
        Local $Split = StringSplit($String, "|")

        If $Split[0] = 1 Then
            $ProcName = $Split[1]
        ElseIf $Split[0] = 2 Then
            If $Split[1] Then $DllName = $Split[1]
            $ProcName = $Split[2]
        EndIf

        If $DllName And $ProcName Then
            Local $Handle = _BinaryCall_LoadLibrary($DllName)
            If Not $Handle Then
                $__BinaryCall_LastError = "LoadLibrary fail on " & $DllName
                Return SetError(1, 0, False)
            EndIf

            Local $Proc = _BinaryCall_GetProcAddress($Handle, $ProcName)
            If Not $Proc Then
                $__BinaryCall_LastError = "GetProcAddress failed on " & $ProcName
                Return SetError(2, 0, False)
            EndIf

            DllStructSetData(DllStructCreate("ptr", $Ptr + $JmpOff), 1, $Proc)
        EndIf

        Local $Diff = Int($Ptr - $Base + $JmpLen + $StringLen + 1)
        $Base += $Diff
        $Length -= $Diff

    Until $Length <= $JmpLen
    Return True
EndFunc

Func _BinaryCall_CodePrepare($Code)
    If Not $Code Then Return ""
    If IsBinary($Code) Then Return $Code

    $Code = String($Code)
    If StringLeft($Code, 2) = "0x" Then Return Binary($Code)
    If StringIsXDigit($Code) Then Return Binary("0x" & $Code)

    Return _BinaryCall_LzmaDecompress(_BinaryCall_Base64Decode($Code))
EndFunc

Func _BinaryCall_SymbolFind($CodeBase, $Identify, $Length = Default)
    $Identify = Binary($Identify)

    If IsKeyword($Length) Then
        $Length = _BinaryCall_RegionSize($CodeBase)
    EndIf

    Local $Ptr = _BinaryCall_MemorySearch($CodeBase, $Length, $Identify)
    If $Ptr = 0 Then Return SetError(1, 0, 0)

    Return $Ptr + BinaryLen($Identify)
EndFunc

Func _BinaryCall_SymbolList($CodeBase, $Symbol)
    If Not IsArray($Symbol) Or $CodeBase = 0 Then Return SetError(1, 0, 0)

    Local $Tag = ""
    For $i = 0 To UBound($Symbol) - 1
        $Tag &=  "ptr " & $Symbol[$i] & ";"
    Next

    Local $SymbolList = DllStructCreate($Tag)
    If @Error Then Return SetError(1, 0, 0)

    For $i = 0 To UBound($Symbol) - 1
        $CodeBase = _BinaryCall_SymbolFind($CodeBase, $Symbol[$i])
        DllStructSetData($SymbolList, $Symbol[$i], $CodeBase)
    Next
    Return $SymbolList
EndFunc

Func _BinaryCall_Create($Code, $Reloc = '', $Padding = 0, $ReleaseOnExit = True, $LibraryImport = True)
    Local $BinaryCode = _BinaryCall_CodePrepare($Code)
    If Not $BinaryCode Then Return SetError(1, 0, 0)

    Local $BinaryCodeLen = BinaryLen($BinaryCode)
    Local $TotalCodeLen = $BinaryCodeLen + $Padding

    Local $CodeBase = _BinaryCall_Alloc($BinaryCode, $Padding)
    If Not $CodeBase Then Return SetError(2, 0, 0)

    If $Reloc Then
        $Reloc = _BinaryCall_CodePrepare($Reloc)
        If Not $Reloc Then Return SetError(3, 0, 0)
        _BinaryCall_Relocation($CodeBase, $Reloc)
    EndIf

    If $LibraryImport Then
        If Not _BinaryCall_ImportLibrary($CodeBase, $BinaryCodeLen) Then
            _BinaryCall_Free($CodeBase)
            Return SetError(4, 0, 0)
        EndIf
    EndIf

    If $ReleaseOnExit Then
        _BinaryCall_ReleaseOnExit($CodeBase)
    EndIf

    Return SetError(0, $TotalCodeLen, $CodeBase)
EndFunc

Func _BinaryCall_CommandLineToArgv($CommandLine, ByRef $Argc, $IsUnicode = False)
    Static $SymbolList
    If Not IsDllStruct($SymbolList) Then
        Local $Code
        If @AutoItX64 Then
            $Code = 'AwAAAASuAgAAAAAAAAAkL48ClEB9jTEOeYv4yYTosNjFNgf81Ag4vS2VP4y4wxFa+4yMI7GDB7CG+xn4JE3cdEVvk8cMp4oIuS3DgTxlcKHGVIg94tvzG/256bizZfGtAETQUCPQjW5+JSx2C/Y4C0VNJMKTlSCHiV5AzXRZ5gw3WFghbtkCCFxWOX+RDSI2oH/vROEOnqc0jfKTo17EBjqX+dW3QxrUe45xsbyYTZ9ccIGySgcOAxetbRiSxQnz8BOMbJyfrbZbuVJyGpKrXFLh/5MlBZ09Cim9qgflbGzmkrGStT9QL1f+O2krzyOzgaWWqhWL6S+y0G32RWVi0uMLR/JOGLEW/+Yg/4bzkeC0lKELT+RmWAatNa38BRfaitROMN12moRDHM6LYD1lzPLnaiefSQRVti561sxni/AFkYoCb5Lkuyw4RIn/r/flRiUg5w48YkqBBd9rXkaXrEoKwPg6rmOvOCZadu//B6HN4+Ipq5aYNuZMxSJXmxwXVRSQZVpSfLS2ATZMd9/Y7kLqrKy1H4V76SgI/d9OKApfKSbQ8ZaKIHBCsoluEip3UDOB82Z21zd933UH5l0laGWLIrTz7xVGkecjo0NQzR7LyhhoV3xszlIuw2v8q0Q/S9LxB5G6tYbOXo7lLjNIZc0derZz7DNeeeJ9dQE9hp8unubaTBpulPxTNtRjog=='
        Else
            $Code = 'AwAAAAR6AgAAAAAAAABcQfD553vjya/3DmalU0BKqABevUb/60GZ55rMwmzpQfPSRUlIl04lEiS8RDrXpS0EoBUe+uzDgZd37nVu9wsJ4fykqYvLoMz3ApxQbTBKleOIRSla6I0V8dNP3P7rHeUfjH0jCho0RvhhVpf0o4ht/iZptauxaoy1zQ19TkPZ/vf5Im8ecY6qEdHNzjo2H60jVwiOJ+1J47TmQRwxJ+yKLakq8QNxtKkRIB9B9ugfo3NAL0QslDxbyU0dSgw2aOPxV+uttLzYNnWbLBZVQbchcKgLRjC/32U3Op576sOYFolB1Nj4/33c7MRgtGLjlZfTB/4yNvd4/E+u3U6/Q4MYApCfWF4R/d9CAdiwgIjCYUkGDExKjFtHbAWXfWh9kQ7Q/GWUjsfF9BtHO6924Cy1Ou+BUKksqsxmIKP4dBjvvmz9OHc1FdtR9I63XKyYtlUnqVRtKwlNrYAZVCSFsyAefMbteq1ihU33sCsLkAnp1LRZ2wofgT1/JtT8+GO2s/n52D18wM70RH2n5uJJv8tlxQc1lwbmo4XQvcbcE91U2j9glvt2wC1pkP0hF23Nr/iiIEZHIPAOAHvhervlHE830LSHyUx8yh5Tjojr0gdLvQ=='
        EndIf
        Local $CodeBase = _BinaryCall_Create($Code)
        If @Error Then Return SetError(1, 0, 0)

        Local $Symbol[] = ["ToArgvW","ToArgvA"]
        $SymbolList = _BinaryCall_SymbolList($CodeBase, $Symbol)
        If @Error Then Return SetError(1, 0, 0)
    EndIf

    Local $Ret
    If $IsUnicode Then
        $Ret = DllCallAddress("ptr:cdecl", DllStructGetData($SymbolList, "ToArgvW"), "wstr", $CommandLine, "int*", 0)
    Else
        $Ret = DllCallAddress("ptr:cdecl", DllStructGetData($SymbolList, "ToArgvA"), "str", $CommandLine, "int*", 0)
    EndIf

    If Not @Error And $Ret[0] <> 0 Then
        _BinaryCall_ReleaseOnExit($Ret[0])
        $Argc = $Ret[2]
        Return $Ret[0]
    Else
        Return SetError(2, 0, 0)
    EndIf
EndFunc

Func _BinaryCall_StdioRedirect($Filename = "CON", $Flag = 1 + 2 + 4)
    Static $SymbolList
    If Not IsDllStruct($SymbolList) Then
        Local $Code, $Reloc
        If @AutoItX64 Then
            $Code = 'AwAAAASjAQAAAAAAAAAkL48ClEB9jTEOeYv4yYTosNjFM1rLNdMULriZUDxTj+ZdkQ01F5zKL+WDCScfQKKLn66EDmcA+gXIkPcZV4lyz8VPw8BPZlNB5KymydM15kCA+uqvmBc1V0NJfzgsF0Amhn0JhM/ZIguYCHxywMQ1SgKxUb05dxDg8WlX/2aPfSolcX47+4/72lPDNTeT7d7XRdm0ND+eCauuQcRH2YOahare9ASxuU4IMHCh2rbZYHwmTNRiQUB/8dLGtph93yhmwdHtyMPLX2x5n6sdA1mxua9htLsLTulE05LLmXbRYXylDz0A'
            $Reloc = 'AwAAAAQIAAAAAAAAAAABAB7T+CzGn9ScQAC='
        Else
            $Code = 'AwAAAASVAQAAAAAAAABcQfD553vjya/3DmalU0BKqABaUcndypZ3mTYUkHxlLV/lKZPrXYWXgNATjyiowkUQGDVYUy5THQwK4zYdU7xuGf7qfVDELc1SNbiW3NgD4D6N6ZM7auI1jPaThsPfA/ouBcx2aVQX36fjmViTZ8ZLzafjJeR7d5OG5s9sAoIzFLTZsqrFlkIJedqDAOfhA/0mMrkavTWnsio6yTbic1dER0DcEsXpLn0vBNErKHoagLzAgofHNLeFRw5yHWz5owR5CYL7rgiv2k51neHBWGx97A=='
            $Reloc = 'AwAAAAQgAAAAAAAAAAABABfyHS/VRkdjBBzbtGPD6vtmVH/IsGHYvPsTv2lGuqJxGlAA'
        EndIf

        Local $CodeBase = _BinaryCall_Create($Code, $Reloc)
        If @Error Then Return SetError(1, 0, 0)

        Local $Symbol[] = ["StdinRedirect","StdoutRedirect","StderrRedirect"]
        $SymbolList = _BinaryCall_SymbolList($CodeBase, $Symbol)
        If @Error Then Return SetError(1, 0, 0)
    EndIf

    If BitAND($Flag, 1) Then DllCallAddress("none:cdecl", DllStructGetData($SymbolList, "StdinRedirect"), "str", $Filename)
    If BitAND($Flag, 2) Then DllCallAddress("none:cdecl", DllStructGetData($SymbolList, "StdoutRedirect"), "str", $Filename)
    If BitAND($Flag, 4) Then DllCallAddress("none:cdecl", DllStructGetData($SymbolList, "StderrRedirect"), "str", $Filename)
EndFunc

Func _BinaryCall_StdinRedirect($Filename = "CON")
    Local $Ret = _BinaryCall_StdioRedirect($Filename, 1)
    Return SetError(@Error, @Extended, $Ret)
EndFunc

Func _BinaryCall_StdoutRedirect($Filename = "CON")
    Local $Ret = _BinaryCall_StdioRedirect($Filename, 2)
    Return SetError(@Error, @Extended, $Ret)
EndFunc

Func _BinaryCall_StderrRedirect($Filename = "CON")
    Local $Ret = _BinaryCall_StdioRedirect($Filename, 4)
    Return SetError(@Error, @Extended, $Ret)
EndFunc

Func _BinaryCall_ReleaseOnExit($Ptr)
    OnAutoItExitRegister('__BinaryCall_DoRelease')
    __BinaryCall_ReleaseOnExit_Handle($Ptr)
EndFunc

Func __BinaryCall_DoRelease()
    __BinaryCall_ReleaseOnExit_Handle()
EndFunc

Func __BinaryCall_ReleaseOnExit_Handle($Ptr = Default)
    Static $PtrList

    If @NumParams = 0 Then
        If IsArray($PtrList) Then
            For $i = 1 To $PtrList[0]
                _BinaryCall_Free($PtrList[$i])
            Next
        EndIf
    Else
        If Not IsArray($PtrList) Then
            Local $InitArray[1] = [0]
            $PtrList = $InitArray
        EndIf

        If IsPtr($Ptr) Then
            Local $Array = $PtrList
            Local $Size = UBound($Array)
            ReDim $Array[$Size + 1]
            $Array[$Size] = $Ptr
            $Array[0] += 1
            $PtrList = $Array
        EndIf
    EndIf
EndFunc

And Finally... My code...

#include "JSON.au3"
#include <Array.au3>
$RAW = FileRead(@ScriptDir & "\JSON.txt")
$JSON_Object = json_decode($RAW)
$Test = json_get($JSON_Object, '["folders"]')
_ArrayDisplay($Test)
; I've tried several variations of json_objget and json_get, with no success.

 

Summary: I'm trying to acquire the folder names, from the above JSON example, as an array using Ward's JSON UDF. Any help is appreciated! :)

SIGNATURE_0X800007D NOT FOUND

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...