[JSON] Extraire des données d'un tableau

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Smeagol
Niveau 1
Niveau 1
Messages : 2
Enregistré le : lun. 21 janv. 2019 00:29
Status : Hors ligne

[JSON] Extraire des données d'un tableau

#1

Message par Smeagol »

Bonjour,

J'ai récupérés des données au format JSON.
J'ai, à priori, un tableau avec une entête, les données du tableau puis des objets. (Si j'ai bien compris)

J'arrive à récupérer les données liées aux objets mais pas du tout en ce qui concerne les données du tableau ou de son entête....

Code : Tout sélectionner

#include <Json.au3>
#include <Array.au3>

$sJson = '{"details_headers":["time","battery_level","controller_gps_latitude"],"details_data":[[8,40,46.0,5.0],[8,41,46.0,5.1],[8,42,46.0,5.2],[8,43,46.0,5.3],[8,44,46.0,5.4]],"version":"1.2","date":"2019-01-19T143057+0100","product_id":"0125"}'
$oJSON = Json_Decode($sJson)
ConsoleWrite($sJson & @CRLF)

$res = Json_ObjGet($oJSON, "version")
ConsoleWrite($res & @CRLF)
$res = Json_ObjGet($oJSON, "date")
ConsoleWrite($res & @CRLF)
$res = Json_ObjGet($oJSON, "product_id")
ConsoleWrite($res & @CRLF)
J'arrive donc à afficher les données liées à la version, la date ou le produit.
Par contre je n'arrive pas à récupérer au niveau du tableau le nom des colonnes puis les données pour chaque colonnes et lignes.
Je me doute qu'il faut que cela passe par un Array avec une boucle mais je ne trouve pas à faire la syntaxe "json_objget".

Merci pour votre aide.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [JSON] Extraire des données d'un tableau  

#2

Message par mikell »

Extrait du forum US :wink:

#include <Json.au3>
#include <Array.au3>

;https://www.autoitscript.com/forum/topic/148114-a-non-strict-json-udf-jsmn/?do=findComment&comment=1291953

    local $Json1  = '{"details_headers":["time","battery_level","controller_gps_latitude"],"details_data":[[8,40,46.0,5.0],[8,41,46.0,5.1],[8,42,46.0,5.2],[8,43,46.0,5.3],[8,44,46.0,5.4]],"version":"1.2","date":"2019-01-19T143057+0100","product_id":"0125"}'

$aReturned = JsonArrayfied($Json1)
_ArrayDisplay($aReturned, "$aReturned")


Func JsonArrayfied($sJsonString, $iEcho = 0)
    Local $sConsoleWriteJson = ConsoleWriteJson($sJsonString, "", $iEcho)
    Local $n, $aLines = StringSplit($sConsoleWriteJson, @LF, 1)
    Local $aTemp, $iRow = 0, $iCol = 0, $m, $aJsonArrayfied[UBound($aLines) + 1][100] ; a lazy but efficient way to go about it
    For $n = 1 To $aLines[0]
        If StringInStr($aLines[$n], ":") + 2 > StringLen($aLines[$n]) Then ContinueLoop
        $aLines[$n] = StringReplace($aLines[$n], "][", "|")
        $aLines[$n] = StringReplace($aLines[$n], "]", "|")
        $aLines[$n] = StringReplace($aLines[$n], "[", "|")
        $aTemp = StringSplit($aLines[$n], "|")
        $iRow += 1
        For $m = 1 To $aTemp[0] - 1
            If $iCol < $m Then $iCol = $m
            $aJsonArrayfied[$iRow][$m - 1] = StringReplace($aTemp[$m], '"', '')
        Next
        $aJsonArrayfied[$iRow][$aTemp[0] - 1] = StringTrimLeft($aTemp[$aTemp[0]], StringInStr($aTemp[$aTemp[0]], ":") + 1)
        $aJsonArrayfied[$iRow][0] = StringMid($aTemp[$aTemp[0]], 5, StringInStr($aTemp[$aTemp[0]], ":") - 5)
    Next
    $aJsonArrayfied[0][0] = $iRow
    $aJsonArrayfied[0][1] = $iCol
    ReDim $aJsonArrayfied[$iRow + 1][$iCol + 1]
    Return $aJsonArrayfied
EndFunc   ;==>JsonArrayfied

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; added by me

Func ConsoleWriteJson($sJsonString, $sDesc = "", $iEcho = 1)
    Local $sOutGlobal
    If $sDesc = "" Then $sDesc = 'ConsoleWriteJson'
    Local $obj = Json_Decode($sJsonString)
    Json_Iterate($sOutGlobal, $obj, '', $sDesc, $iEcho)
    Return $sOutGlobal
EndFunc   ;==>ConsoleWriteJson

Func Json_Iterate(ByRef $sOutGlobal, $obj, $string, $pre = "", $iEcho = 1)
    Local $sOut = ""
    Local $temp, $i, $b
    If ($pre <> "") Then
        $sOut &= $pre & ": "
        If $iEcho Then ConsoleWrite($pre & ": ")
    EndIf
    $a = Json_Get_ShowResult($obj, $string, $sOutGlobal, $iEcho)
    If IsArray($a) Then
        For $i = 0 To UBound($a) - 1
            Json_Iterate($sOutGlobal, $obj, $string & '[' & $i & ']', $pre, $iEcho)
        Next
    ElseIf IsObj($a) Then
        $b = Json_ObjGetKeys($a)
        For $temp In $b
            Json_Iterate($sOutGlobal, $obj, $string & '["' & $temp & '"]', $pre, $iEcho)
        Next
    EndIf
    Return $sOutGlobal
EndFunc   ;==>Json_Iterate

Func Json_Get_ShowResult($Var, $Key, ByRef $sOutGlobal, $iEcho)
    Local $sOut = ""
    Local $Ret = Json_Getr($Var, $Key)
    If @error Then
        Switch @error
            Case 1
                $sOut &= "Error 1: key not exists" & @LF
                If $iEcho Then ConsoleWrite($sOut)
            Case 2
                $sOut &= "Error 2: syntax error" & @LF
                If $iEcho Then ConsoleWrite($sOut)
        EndSwitch
    Else
        $sOut &= $Key & " => " & VarGetType($Ret) & ": " & $Ret & @LF
        If $iEcho Then ConsoleWrite($sOut)
    EndIf
    $sOutGlobal &= $sOut ;& $Ret
    Return $Ret
EndFunc   ;==>Json_Get_ShowResult

Func Json_Getr($Var, $Key)
    If Not $Key Then Return $Var
    Local $Match = StringRegExp($Key, "(^\[([^\]]+)\])", 3)
    If IsArray($Match) Then
        Local $Index = Json_Decode($Match[1])
        $Key = StringTrimLeft($Key, StringLen($Match[0]))
        If IsString($Index) And Json_IsObject($Var) And Json_ObjExists($Var, $Index) Then
            Local $Ret = Json_Getr(Json_ObjGet($Var, $Index), $Key)
            Return SetError(@error, 0, $Ret)
        ElseIf IsNumber($Index) And IsArray($Var) And $Index >= 0 And $Index < UBound($Var) Then
            Local $Ret = Json_Getr($Var[$Index], $Key)
            Return SetError(@error, 0, $Ret)
        Else
            Return SetError(1, 0, "")
        EndIf
    EndIf
    Return SetError(2, 0, "")
EndFunc   ;==>Json_Getr
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Smeagol
Niveau 1
Niveau 1
Messages : 2
Enregistré le : lun. 21 janv. 2019 00:29
Status : Hors ligne

Re: [JSON] Extraire des données d'un tableau

#3

Message par Smeagol »

Merci, cela fonctionne effectivement très bien.

Je débute et j'aimerai comprendre un peu plus.
Serait-il possible de me commenter le code, au moins dans les grandes lignes (Ce à quoi sert chaque pavé func, par exemple) ?
Histoire que je comprenne la logique du traitement pour pouvoir la décortiquer ensuite.

Merci bien !
Répondre