BinaryBrother Posted November 7, 2021 Posted November 7, 2021 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. expandcollapse popup; ============================================================================================================================ ; 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... expandcollapse popup; ============================================================================= ; 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
Danp2 Posted November 7, 2021 Posted November 7, 2021 Take a look at Json_Dump. You should be able to determine the correct syntax with that. Latest Webdriver UDF Release Webdriver Wiki FAQs
BinaryBrother Posted November 7, 2021 Author Posted November 7, 2021 Well, Danp2... Your 1,103 MVP speaks for itself! That's everything that I needed. SIGNATURE_0X800007D NOT FOUND
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now