Jump to content

Recommended Posts

Posted (edited)

I know how JSON works. However JSON data is typically received from web based servers. 

 

My question is:

Has anyone considered to use, or currently actively using JSON as an internal data container? 

Internal here as in an ordinary AutoIt data type, generated, populated and manipulated within an AutoIt script, without any external data sources. 

The JSON and BinaryCall UDFs work well and appear the de facto defaults. Are there any thoughts on using JSON for internal variable values instead of the typical array? 

Also, there can be situations where such a JSON collection contains an array and it will have to be parsed using typical array functions. 

Currently I am working on a small project where I have to keep and use various identifiers from different sources. There are several ideas in this regard, some involving SQL child tables and arrays stored with keys (maps), which lead me to think that JSON may be a more suitable data container. It readily shrinks and stretches, allowing for dynamic data growth.  JSONs ability to add new repeating data groups on the fly makes it particularly powerful and appealing. 

Ideas and suggestions welcome

Skysnake

Edited by Skysnake

Skysnake

Why is the snake in the sky?

Share this post


Link to post
Share on other sites

FYI SQLite JSON1 functions work like a charm. I know you're using SQLite a lot so this may be a decent solution. Just store your JSON source in a temp table and peek-poke in from there. You can as well issue a direct query without having to store it first in case the desired operation (creation, extraction, modification) isn't repetitive.


This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Share this post


Link to post
Share on other sites

:)

It's funny how we miss the obvious. Yes, you are right about SQLite, and I often refer to the SQlite JSON documentation... For some reason the AutoIt-SQLite-JSON link has passed me by :>

That's also an easy error checking device :)

Will definitely have a look. Thanks for the reminder 


Skysnake

Why is the snake in the sky?

Share this post


Link to post
Share on other sites

Here's a very simple example of validating that json is well-formed and extracting a value from well-formed JSON:

#include <SQLite.au3>

example()

Func example()
        Const $TEST_JSON = _
                           '{' & _
                           '    "manifest_version": 2,' & _
                           '    "name": "Google Apps Certification app",' & _
                           '    "description": "Link to Google Apps Certification website",' & _
                           '    "version": "1.1",' & _
                           '    "icons": {' & _
                           '        "128": "128.png"' & _
                           '    },' & _
                           '    "app": {' & _
                           '        "urls": [' & _
                           '            "http://certification.googleapps.com/app-info/"' & _
                           '        ],' & _
                           '        "launch": {' & _
                           '            "web_url": "http://certification.googleapps.com/"' & _
                           '        }' & _
                           '    },' & _
                           '    "permissions": [' & _
                           '        "unlimitedStorage",' & _
                           '        "notifications"' & _
                           '    ]' & _
                           '}'

        Const $SQLITE_DLL = "c:\program files\sqlite\sqlite3.dll" ;<-- Change to the location of your sqlite dll

        Local $aRow
        Local $hQuery

        ;Init sqlite and create a memory db
        _SQLite_Startup($SQLITE_DLL, False, 1)
        If @error Then Exit MsgBox($MB_ICONERROR, "SQLite Error", "Unable to start SQLite. Check existence of DLL")
        _SQLite_Open()

        ;Example of validating json (Good return means JSON is well-formed)
        If _SQLite_Query(-1, "select json('" & $TEST_JSON & "');", $hQuery) = $SQLITE_OK Then
            While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
                ConsoleWrite("Minimized JSON = " & $aRow[0] & @CRLF)
            WEnd
        EndIf

        ;Example of extracting data
        If _SQLite_Query(-1, "select json_extract('" & $TEST_JSON & "', '$.version');", $hQuery) = $SQLITE_OK Then
            While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
                ConsoleWrite("version = " & $aRow[0] & @CRLF)
            WEnd
        EndIf

        ;Close db and shutdown sqlite
        _SQLite_Close()
        _SQLite_Shutdown()

EndFunc

 

Share this post


Link to post
Share on other sites
#cs ----------------------------------------------------------------------------

    AutoIt Version: 3.3.14.2
    Author:         TheXman
    JSON as AutoIt data type

    Script Function:
    https://www.autoitscript.com/forum/topic/197243-json-as-autoit-data-type/?do=findComment&comment=1414692

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
#include <SQLite.au3>

example()

Func example()

    ; https://en.m.wikipedia.org/wiki/00_Agent
    Const $TEST_JSON = _
            '{' & _
            '    "James Bond": "007",' & _
            '    "Randy Enton": "006",' & _
            '    "Sam Johnston": "0012"' & _
            '}'
    ;;#CE

    Const $SQLITE_DLL = @ScriptDir & "\sqlite3.dll" ;<-- Change to the location of your sqlite dll

    Local $aRow
    Local $hQuery

    ;Init sqlite and create a memory db
    _SQLite_Startup($SQLITE_DLL, False, 1)
    If @error Then Exit MsgBox($MB_ICONERROR, "SQLite Error", "Unable to start SQLite. Check existence of DLL")
    _SQLite_Open()

    ;Example of validating json (Good return means JSON is well-formed)
    If _SQLite_Query(-1, "select json('" & $TEST_JSON & "');", $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite("Minimized JSON = " & $aRow[0] & @CRLF)
        WEnd
    EndIf

    ;Example of extracting data
    Local $sJSONValueToFind = "James Bond"
    ;;;$sJSONQuery = "select json_extract('" & $TEST_JSON & "', '$.James Bond') ;"
    $sJSONQuery = "select json_extract('" & $TEST_JSON & "', '$." & $sJSONValueToFind & "') ;"
    ConsoleWrite($sJSONQuery & @CRLF)
    If _SQLite_Query(-1, $sJSONQuery, $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite($sJSONValueToFind & ": " & $aRow[0] & @CRLF)
        WEnd
    EndIf


    ;Example of setting data
    Local $sJSONAttribToSet = "Stuart Thomas"
    Local $sJSONValueToSet = "005"
    Local $sJSONValueToFind = "Stuart Thomas"
    ;;;$sJSONQuery = "select json_extract('" & $TEST_JSON & "', '$.e4') ;"
    $sJSONQuery = "select json_set('" & $TEST_JSON & "', '$." & $sJSONAttribToSet & "'," & $sJSONValueToSet & ") ;"
    ConsoleWrite("88 " & $sJSONQuery & @CRLF)
    If _SQLite_Query(-1, $sJSONQuery, $sJSONQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($sJSONQuery, $aRow) = $SQLITE_OK
            ConsoleWrite("91 " & $sJSONValueToFind & ": " & $aRow[0] & @CRLF)
            Local $improvedJSON = $aRow[0]
        WEnd
    EndIf


    ;Local $improvedJSON = $aRow[0]
    ConsoleWrite("$improvedJSON " & $improvedJSON & @CRLF)

    $sJSONQuery = "select json_extract('" & $improvedJSON & "', '$." & $sJSONValueToFind & "') ;"
    ConsoleWrite("98 " & $sJSONQuery & @CRLF)
    If _SQLite_Query(-1, $sJSONQuery, $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite("101 " & $sJSONValueToFind & ": " & $aRow[0] & @CRLF)
        WEnd
    EndIf



    ;Close db and shutdown sqlite
    _SQLite_Close()
    _SQLite_Shutdown()

EndFunc   ;==>example

@TheXman I modded your code :)

Added a SQLite JSON_SET statement.  https://www.sqlite.org/json1.html#jins see 4.5 

I am struggling with

  • How to insert the JSON string into the SQLite table (probably just a syntax issue)
  • and how to save '007' as string and not a number ie '007' and not '7'

Thx

Skysnake

Edited by Skysnake
typo

Skysnake

Why is the snake in the sky?

Share this post


Link to post
Share on other sites
2 minutes ago, Skysnake said:

How to insert the JSON string into the SQLite table (probably just a syntax issue)

JSON is text so you can simply and safely store it in a TEXT column.

31 minutes ago, Skysnake said:

how to save '007' as string and not a number ie '007' and not '7'

You need to quote the value, like this:

; Script Start - Add your code below here
#include <SQLite.au3>

example()

Func example()
    Const $TEST_JSON = _
            '{' & _
            '    "James Bond": "007",' & _
            '    "Randy Enton": "006",' & _
            '    "Sam Johnston": "0012"' & _
            '}'

    Const $SQLITE_DLL = "C:\SQLite\bin\sqlite3.dll" ;<-- Change to the location of your sqlite dll
    Local $aRow
    Local $hQuery

    ;Init sqlite and create a memory db
    _SQLite_Startup($SQLITE_DLL, False, 1)
    If @error Then Exit MsgBox($MB_ICONERROR, "SQLite Error", "Unable to start SQLite. Check existence of DLL")
    _SQLite_Open()

    ;Example of validating json (Good return means JSON is well-formed)
    If _SQLite_Query(-1, "select json('" & $TEST_JSON & "');", $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite("Source JSON = " & $aRow[0] & @CRLF)
        WEnd
    EndIf

    ;Example of setting data
    Local $sJSONAttribToSet = "Stuart Thomas"
    Local $sJSONValueToSet = "005"
    Local $sJSONValueToFind = $sJSONAttribToSet
    ; #### note double quotes around $sJSONValueToSet ####
    $sJSONQuery = "select json_set('" & $TEST_JSON & "', '$." & $sJSONAttribToSet & "',""" & $sJSONValueToSet & """) ;"
    Local $sChangedJSON
    If _SQLite_Query(-1, $sJSONQuery, $sJSONQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($sJSONQuery, $aRow) = $SQLITE_OK
            $sChangedJSON = $aRow[0]
        WEnd
    EndIf

    ConsoleWrite("$sChangedJSON " & $sChangedJSON & @CRLF)

    $sJSONQuery = "select json_extract('" & $sChangedJSON & "', '$." & $sJSONValueToFind & "') ;"
    ConsoleWrite($sJSONQuery & @CRLF)
    If _SQLite_Query(-1, $sJSONQuery, $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite($sJSONValueToFind & ": " & $aRow[0] & @CRLF)
        WEnd
    EndIf



    ;Close db and shutdown sqlite
    _SQLite_Close()
    _SQLite_Shutdown()

EndFunc   ;==>example

 


This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Share this post


Link to post
Share on other sites

Hi SkySnake -

Below you will see a slighly modified version of your script.  I identified my modifications by wrapping them in

"; =========== Modified  ====================="

Also notice that I changed the method of validating json by changing the function to json_valid().

#cs ----------------------------------------------------------------------------

    AutoIt Version: 3.3.14.2
    Author:         TheXman
    JSON as AutoIt data type

    Script Function:
    https://www.autoitscript.com/forum/topic/197243-json-as-autoit-data-type/?do=findComment&comment=1414692

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
#include <SQLite.au3>

example()

Func example()

    ; https://en.m.wikipedia.org/wiki/00_Agent
    Const $TEST_JSON = _
            '{' & _
            '    "James Bond": "007",' & _
            '    "Randy Enton": "006",' & _
            '    "Sam Johnston": "0012"' & _
            '}'
    ;;#CE

    Const $SQLITE_DLL = "c:\program files\sqlite\sqlite3.dll" ;<-- Change to the location of your sqlite dll

    Local $aRow
    Local $hQuery

    ;Init sqlite and create a memory db
    _SQLite_Startup($SQLITE_DLL, False, 1)
    If @error Then Exit MsgBox($MB_ICONERROR, "SQLite Error", "Unable to start SQLite. Check existence of DLL")
    _SQLite_Open()

; =========== Modified  =====================
    Local $sQuery, $sKey
    Local $vValue

    ;Example of validating json (Good return means JSON is well-formed)
    $sQuery = StringFormat("SELECT json_valid('%s')", $TEST_JSON)
    ConsoleWrite(@CRLF & "Query: " & $sQuery & @CRLF)
    If _SQLite_Query(-1, $sQuery, $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite("Value: " & $aRow[0] & @CRLF)
        WEnd
    EndIf

    ;Example of validating json (Good return means JSON is well-formed)
    $sKey   = "Stuart Thomas"
    $vValue = "007"
    $sQuery = StringFormat("SELECT json_set('%s', '$.%s','%s')", $TEST_JSON, $sKey, $vValue)
    ConsoleWrite(@CRLF & "Query: " & $sQuery & @CRLF)
    If _SQLite_Query(-1, $sQuery, $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite("Value: " & $aRow[0] & @CRLF)
        WEnd
    EndIf

    ConsoleWrite(@CRLF)
; =========== Modified  =====================

    ;Example of extracting data
    Local $sJSONValueToFind = "e4"
    ;;;$sJSONQuery = "select json_extract('" & $TEST_JSON & "', '$.e4') ;"
    $sJSONQuery = "select json_extract('" & $TEST_JSON & "', '$." & $sJSONValueToFind & "') ;"
    ConsoleWrite($sJSONQuery & @CRLF)
    If _SQLite_Query(-1, $sJSONQuery, $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite($sJSONValueToFind & ": " & $aRow[0] & @CRLF)
        WEnd
    EndIf


    ;Example of setting data
    Local $sJSONAttribToSet = "Stuart Thomas"
    Local $sJSONValueToSet = "005"
    Local $sJSONValueToFind = "Stuart Thomas"
    ;;;$sJSONQuery = "select json_extract('" & $TEST_JSON & "', '$.e4') ;"
    $sJSONQuery = "select json_set('" & $TEST_JSON & "', '$." & $sJSONAttribToSet & "'," & $sJSONValueToSet & ") ;"
    ConsoleWrite("88 " & $sJSONQuery & @CRLF)
    If _SQLite_Query(-1, $sJSONQuery, $sJSONQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($sJSONQuery, $aRow) = $SQLITE_OK
            ConsoleWrite("91 " & $sJSONValueToFind & ": " & $aRow[0] & @CRLF)
            Local $improvedJSON = $aRow[0]
        WEnd
    EndIf


    ;Local $improvedJSON = $aRow[0]
    ConsoleWrite("$improvedJSON " & $improvedJSON & @CRLF)

    $sJSONQuery = "select json_extract('" & $improvedJSON & "', '$." & $sJSONValueToFind & "') ;"
    ConsoleWrite("98 " & $sJSONQuery & @CRLF)
    If _SQLite_Query(-1, $sJSONQuery, $hQuery) = $SQLITE_OK Then
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
            ConsoleWrite("101 " & $sJSONValueToFind & ": " & $aRow[0] & @CRLF)
        WEnd
    EndIf



    ;Close db and shutdown sqlite
    _SQLite_Close()
    _SQLite_Shutdown()

EndFunc   ;==>example

 

 

By the way, although sqlite has some nice json functionality, you may want to check out my new UDF that lets you run jq. You can read more about it here:

 

Edited by TheXman
Fixed the comments to accurately represent the code blocks

Share this post


Link to post
Share on other sites
1 hour ago, argumentum said:

I've tried it and find it slow.

Yes, since jq itself is a command line tool, it is a bit slower than say a dll, especially if one is just retrieving a lot of scalar values.  However, it is very powerful.  I can definitely imagine more advanced scenarios in which jq may not only be faster, but much easier too.   If json slicing and dicing is necessary, or if you need to do mathematical functions against json data like averages or summing, or even need to extract, sort,  and/or generate json from existing json files, jq may be a better choice and a lot easier to use.  In addition, there are many things that jq can do that other json parsers cannot.  That's primarily because jq is a json processing tool as opposed to a json parser.  In any case, It's just another tool for the tool box.  :)

...And thanks for trying it out.  :thumbsup:

Edited by TheXman

Share this post


Link to post
Share on other sites
14 hours ago, jchd said:

You need to quote the value, like this:

:)  @jchd  you posted elsewhere a very handy little function for quoting standard SQL strings: _SQLStr() which quotes and doubles ' inline.

What would the JSON equivalent be? _SQLJSON() ...

Func _SQLJSON($s)
    Return('""' & StringReplace($s, "'", "''") & '""')
EndFunc

Replace ' with double for SQL , and use double "" around the JSON value...

Am I on the right track?

@TheXman & @argumentum thx. :)

 


Skysnake

Why is the snake in the sky?

Share this post


Link to post
Share on other sites
5 hours ago, Skysnake said:

Am I on the right track?

There's an extra " around the result, but that isn't the whole story:

#include <SQLite.au3>

Const $SQLITE_DLL = "C:\SQLite\bin\sqlite3.dll" ;<-- Change to the location of your sqlite dll
Local $aRow

;Init sqlite and create a memory db
_SQLite_Startup($SQLITE_DLL, False, 1)
If @error Then Exit MsgBox($MB_ICONERROR, "SQLite Error", "Unable to start SQLite. Check existence of DLL")
_SQLite_Open()

Local $sTEST_JSON = "Mc'Donald's" & @TAB & 'food / if you call that "food" \' & @CRLF & "this is the last verse."
Local $sEscapedJSON = _JSON_SQL_Escape($sTEST_JSON)
ConsoleWrite("Escaped JSON = " & $sEscapedJSON & @LF)

If _SQLite_QuerySingleRow(-1, "select json_extract(" & $sEscapedJSON & ", '$');", $aRow) = $SQLITE_OK Then
    ConsoleWrite("Valid JSON = " & $aRow[0] & @LF)
EndIf

Exit

; Escape chars in JSON strings as per rfc-7159 (http://www.rfc-editor.org/rfc/rfc7159.txt)
; then returns a valid SQL string containing a valid JSON string type.
;
; Literal single & double quotes are escaped to hex to avoid issues
; this is less human-readable but rock-solid (see below for full Unicode)
;
; If you expect Unicode chars outside the BMP (Basic Multilingual Plane)
; you need to convert codepoints > 0xFFFF to their surrogate pair in Hex

Func _JSON_SQL_Escape($s)
    ; escape / \ with a backslash
    $s = StringRegExpReplace($s, '([\\/])', '\\$1')
    ; escape single quotes to hex
    $s = StringRegExpReplace($s, "'", '\\u0027')
    ; escape solidus, backslash, double quotes and control chars to Hex
    ; then enclose the whole string in double quotes so that it's then a valid JSON literal string
    ; then enclose it in single quotes so that the SQL parser sees a valid SQL string
    Return '''"' & Execute('"' & StringRegExpReplace($s, '(["\x00-\x1f])', '" & "\\u" & Hex(Asc(''$1''), 4) & "') & '"') & '"'''
EndFunc

 

Edited by jchd

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Share this post


Link to post
Share on other sites

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

  • Similar Content

    • By Blitzkid
      Hello, i want to search several directories for files with the largest numbers behind them (Like "video123") . They dont have a datatype. But there are also files with longer names and datatypes in these folders (Like "video778.mp4"). Is it possible to filter the _FileListToArray Syntax from
      to smth. like
       
      Here is my Code
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <array.au3> #include <File.au3> $filedir = @ScriptDir & "\" _checkfile() Func _checkfile() ConsoleWrite("______________________" & @CRLF) Local $arr[3] = ["music", "picture", "video"] For $i = 0 To UBound($arr) - 1 Local $arrayfiles = _FileListToArray($filedir & $arr[$i], $arr[$i] & "*", 1) If @error = 1 Then ConsoleWrite($arr[$i] & "Error 1") EndIf If @error = 4 Then ConsoleWrite($arr[$i] & "Error 2") ;Exit EndIf $arrayfilter = _ArrayMax($arrayfiles, 0, 1) Global $stringfiles = StringReplace($arrayfilter, $arr[$i], "") ConsoleWrite($arrayfilter & @CRLF) Next EndFunc ;==>_checkfile  
    • By jmp
      Script running good but error in line 7.
      When i run this script :
      #include <IE.au3> #include <Array.au3> $oIE = _IEAttach ("Shop") $oTable = _IETableGetCollection ($oIE, 1) $aTableData = _IETableWriteToArray ($oTable) For $inumber = 1 To UBound($aTableData) -1 $table = $aTableData[4][$inumber] MsgBox(0, "", $table) Next I got Error: array variable has incorrect number of subscripts or subscript dimension range exceeded
    • By nacerbaaziz
      Good morning guys, i hope that you're all well.
      guys, i have a problem and i hope that you can help me
      i've created an 3d array
      the array Contain a Categories info
      as folow
      $array[n][0][0] = Categorie name
      $array[n][0][1] = Categorie file path
      $array[n][0][2] = Categorie contents number
      $array[n][m][0] = link name
      $array[n][m][1] = link url
      $array[n][m][2] = link section name
      in my tool i want to add an option to delete a Category
      as you know the Categorie mean that must delete a region from the array
      when i tried to use _arrayDelete
      with the 2d array it work well
      but here i couldn't find any way to do that, can any one help me please?
      thanks in advance.
    • By nacerbaaziz
      hello sirs, please help me
      i tried to create a function that read a folder files to 3d array
      e.g
      $array[n][0][0] = ctName
      $array[n][0][1] = ctFilePath
      $array[n][0][2] = crtsections number
      $array[n][m][0] = KeyName
      $array[n][m][1] = KeyVal
      $array[n][m][2] = keySectionName
       
      that the array
      when i put one file into the folder all things work fine
      but when i put more than one file
      the last file worked fine but the others only the first key is showing
      please can you help me to correct this problem
      here is the example with the folder
      please accept my greetings
      and thanks in advance
       
      array3d.zip
    • By Ward
      Introduction
      JSON (Javascript Object Notation) is a popular data-interchange format and supported by a lot of script languages. On AutoIt, there is already a >JSON UDF written by Gabriel Boehme. It is good but too slow, and not supports unicode and control characters very well. So I write a new one (and of course, fast one as usual).

      I use a machine code version of JSON parser called "jsmn". jsmn not only supports standard JSON, but also accepts some non-strict JSON string. See below for example.
       
      Important Update!!
      I rename the library from jsmn.au3 to json.au3. All function names are changed, too.
       
      Decoding Function
      Json_Decode($Json) $Json can be a standard or non-standard JSON string. For example, it accepts:
      { server: example.com port: 80 message: "this looks like a config file" } The most JSON data type will be decoded into corresponding AutoIt variable, including 1D array, string, number, true, false, and null. JSON object will be decoded into "Windows Scripting Dictionary Object" retuned from ObjCreate("Scripting.Dictionary"). AutoIt build-in functions like IsArray, IsBool, etc. can be used to check the returned data type. But for Object and Null, Json_IsObject() and Json_IsNull() should be used.

      If the input JSON string is invalid, @Error will be set to $JSMN_ERROR_INVAL. And if the input JSON string is not finish (maybe read from stream?), @Error will be set to $JSMN_ERROR_PART.

      Encoding Function
      Json_Encode($Data, $Option = 0, $Indent = "\t", $ArraySep = ",\r\n", $ObjectSep = ",\r\n", $ColonSep = ": ") $Data can be a string, number, bool, keyword(default or null), 1D arrry, or "Scripting.Dictionary" COM object. Ptr will be converted to number, Binary will be converted to string in UTF8 encoding. Other unsupported types like 2D array, dllstruct or object will be encoded into null.

      $Option is bitmask consisting following constant:
      $JSON_UNESCAPED_ASCII ; Don't escape ascii charcters between chr(1) ~ chr(0x1f) $JSON_UNESCAPED_UNICODE ; Encode multibyte Unicode characters literally $JSON_UNESCAPED_SLASHES ; Don't escape / $JSON_HEX_TAG ; All < and > are converted to \u003C and \u003E $JSON_HEX_AMP ; All &amp;amp;amp;amp;s are converted to \u0026 $JSON_HEX_APOS ; All ' are converted to \u0027 $JSON_HEX_QUOT ; All " are converted to \u0022 $JSON_PRETTY_PRINT ; Use whitespace in returned data to format it $JSON_STRICT_PRINT ; Make sure returned JSON string is RFC4627 compliant $JSON_UNQUOTED_STRING ; Output unquoted string if possible (conflicting with $JSMN_STRICT_PRINT) Most encoding option have the same means like PHP's json_enocde() function. When $JSON_PRETTY_PRINT is set, output format can be change by other 4 parameters ($Indent, $ArraySep, $ObjectSep, and $ColonSep). Because these 4 output format parameters will be checked inside Jsmn_Encode() function, returned string will be always accepted by Jsmn_Decode(). $JSON_UNQUOTED_STRING can be used to output unquoted string that also accetped by Jsmn_Decode().

      $JSON_STRICT_PRINT is used to check output format setting and avoid non-standard JSON output. So this option is conflicting with $JSON_UNQUOTED_STRING.

      Get and Put Functions
      Json_Put(ByRef $Var, $Notation, $Data, $CheckExists = False) Json_Get(ByRef $Var, $Notation) These functions helps user to access object or array more easily. Both dot notation and square bracket notation can be supported. Json_Put() by default will create non-exists objects and arrays. For example:
      Local $Obj Json_Put($Obj, ".foo", "foo") Json_Put($Obj, ".bar[0]", "bar") Json_Put($Obj, ".test[1].foo.bar[2].foo.bar", "Test") Local $Test = Json_Get($Obj, '["test"][1]["foo"]["bar"][2]["foo"]["bar"]') ; "Test" Object Help Functions
      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_ObjClear(ByRef $Object) These functions are just warps of "Scripting.Dictionary" COM object. You can use these functions if you are not already familiar with it.
       
      == Update 2013/05/19 ==
       
      * Add Jsmn_Encode() option "$JSMN_UNESCAPED_ASCII". Now the default output of Json_Encode() is exactly the same as PHP's json_encode() function (for example, chr(1) will be encoded into u0001).
      $JSON_UNESCAPED_ASCII ; Don't escape ascii charcters between chr(1) ~ chr(0x1f)  
      == Update 2015/01/08 ==
      * Rename the library from jsmn.au3 to json.au3. All function names are changed, too.
      * Add Json_Put() and Json_Get()
      * Add Null support
      * Using BinaryCall.au3 to loading the machine code.
       
      == Update 2018/01/13==   (Jos)
      * Add JsonDump() to list all Json Keys and their values to easily figure out what they are.
      == Update 2018/10/01==  (Jos)
      * Fixed JsonDump() some fields and values were not showing as discussed here  - tnx @TheXman .
      == Update 2018/10/01b==   (Jos)
      * Added Json_ObjGetItems, Tidied source and fixed au3check warnings - tnx @TheXman .
      == Update 2018/10/28==   (Jos)
      * Added declaration for $value to avoid au3check warning - tnx @DerPensionist
      == Update 2018/12/16==   (Jos)
      * Added another declaration for $value to avoid au3check warning  and updated the version at the top - tnx @maniootek
      == Update 2018/12/29==   (Jos)
      * Changed Json_ObjGet() and Json_ObjExists() to allow for multilevel object in string.
      == Update 2019/01/17==   (Jos)
      * Added support for DOT notation in JSON functions.
      _Json(2019.01.17).zip   reverted to this version as the last version has some regression issues that is being worked on.
      == Update 2019/07/15==   (Jos)
      *  Added support for reading keys with a dot inside when using a dot as separator (updated)
       
×
×
  • Create New...