Что нового

Получить массив из Json c фильтром по условию

Fanatmb

Новичок
Сообщения
56
Репутация
0
Есть Массив, который получен в виде JSON. Как прочитать и получить значения элементов вроде понятно.

Но получается так, что в ответе приходит только одна строка, хотя в массиве их 8.
Подскажите, как одним опросом вывести все элементы массива столбиком, а также отфильтровать строки , например в которых coef >= 0 или wID = 195

Данные JSON присутствуют в коде.

Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <Array.au3>
#Include <Json.au3>
#include <Encoding.au3>
#include <Date.au3>


Global $chk=0
Global $j=0



Func Logging(ByRef $idTEXT,$whinfo)
   
    local $editBefore = GuiCtrlRead($idTEXT)
    GUICtrlSetData($idTEXT, $whinfo&@CRLF&$editBefore& " ")
   
EndFunc


Func Request()

local $cTime = @YEAR & "-" & @MON & "-" & @MDAY &"   " & @HOUR & ":" & @MIN & ":" & @SEC &"   "
local $dataX = ' [{"date":"2024-11-21T00:00:00Z","coef":-1,"wID":195,"Name":"Диски","tName":"Лето","tID":5},{"date":"2024-12-04T00:00:00Z","coef":-1,"wID":225,"Name":"Шины","tName":"Лето","tID":5},{"date":"2024-12-04T00:00:00Z","coef":0,"wID":225,"Name":"Шины","tName":"Зима","tID":6},{"date":"2024-12-04T00:00:00Z","coef":2,"wID":225,"Name":"Шины","tName":"Всесезонка","tID":2},{"date":"2024-11-21T00:00:00Z","coef":-1,"wID":195,"Name":"Диски","tName":"Лето","tID":5},{"date":"2024-11-30T00:00:00Z","coef":-1,"wID":225,"Name":"Шины","tName":"Лето","tID":5},{"date":"2024-11-25T00:00:00Z","coef":0,"wID":195,"Name":"Диски","tName":"Зима","tID":6},{"date":"2024-11-29T00:00:00Z","coef":2,"wID":225,"Name":"Шины","tName":"Всесезонка","tID":2}]'

local $resultX = Json_Decode($dataX)

        if $chk = 1 Then
            If IsArray($resultX) Then
    For $j=0 to UBound($resultX)-1
         $res = $cTime & "  " & _DateTimeFormat(Json_Get($resultX,"[" & $j & "][date]"),2) & "  " & Json_Get($resultX,"[" & $j & "][Name]") & "  " & Json_Get($resultX,"[" & $j & "][coef]") & "  " & Json_Get($resultX,"[" & $j & "][tName]")
            ConsoleWrite($res & @CRLF)
            local $whinfo = $res
                    local $editBefore = GuiCtrlRead($idTEXT)
            GUICtrlSetData($idTEXT, $whinfo&@CRLF&$editBefore& " ")
    Next
EndIf

        Sleep(2000)
        else
            Exit
        EndIf
   
    
EndFunc

Func CLOSEClicked()
  Exit
EndFunc

Func OKButton()
        local $cTime = @YEAR & "-" & @MON & "-" & @MDAY &"   " & @HOUR & ":" & @MIN & ":" & @SEC &"   "
        if $chk = 0 Then
        GUICtrlSetData($iOKButton,"Стоп")
        $whinfo  = $cTime & "  Пошёл процесс!"
        Logging($idTEXT,$whinfo)
        $chk = 1
        Sleep(1000)
        AdlibRegister ("Request",3000)
        else
        AdlibUnRegister ("Request")
        GUICtrlSetData($iOKButton,"Старт")
        $whinfo =$cTime & "  Мониторинг остановлен"
        Logging($idTEXT,$whinfo)
        $chk = 0
       
        EndIf
EndFunc


Opt("GUIOnEventMode", 1)  ;
Local $mainwindow = GUICreate("Мониторинг", 469, 339, (@DesktopWidth - 469) / 2, (@DesktopHeight - 339) / 2, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS + $WS_POPUP + $WS_EX_TOOLWINDOW)
    Opt("GUIResizeMode",802)
    Local $hWnd = WinGetHandle("[ACTIVE]")
    WinSetOnTop($hWnd, "", 1)
    GUISetState(@SW_SHOW, $mainwindow)

    Local $iOKButton = GUICtrlCreateButton("Старт", 380, 8, 60)

    local $idTEXT = GUICtrlCreateEdit("", 30, 50, 420, 300, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_MULTILINE + $ES_WANTRETURN+$ES_READONLY)
    GUICtrlSetTip(-1, "Мониторинг")

    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUICtrlSetOnEvent($iOKButton, "OKButton")

while 1
    sleep(10)
wend

Сообщение автоматически объединено:

По одному значению COEF смог отфильтровать, а как быть, если задать для wID yнесколько условий с перечислением?

Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <Array.au3>
#Include <Json.au3>
#include <Encoding.au3>
#include <Date.au3>


Global $chk=0
Global $j=0



Opt("GUIOnEventMode", 1)  ;
Local $mainwindow = GUICreate("Мониторинг", 469, 339, (@DesktopWidth - 469) / 2, (@DesktopHeight - 339) / 2, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS + $WS_POPUP + $WS_EX_TOOLWINDOW)
    Opt("GUIResizeMode",802)
    Local $hWnd = WinGetHandle("[ACTIVE]")
    WinSetOnTop($hWnd, "", 1)
    GUISetState(@SW_SHOW, $mainwindow)

    Local $iOKButton = GUICtrlCreateButton("Старт", 380, 8, 60)

    local $idTEXT = GUICtrlCreateEdit("", 30, 50, 420, 300, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_MULTILINE + $ES_WANTRETURN+$ES_READONLY)
    GUICtrlSetTip(-1, "Мониторинг")

    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUICtrlSetOnEvent($iOKButton, "OKButton")

while 1
    sleep(10)
wend


Func Logging(ByRef $idTEXT,$whinfo)
    
    local $editBefore = GuiCtrlRead($idTEXT) 
    GUICtrlSetData($idTEXT, $whinfo&@CRLF&$editBefore& " ")
    
EndFunc


Func Request()

local $cTime = @YEAR & "-" & @MON & "-" & @MDAY &"   " & @HOUR & ":" & @MIN & ":" & @SEC &"   " 
local $dataX = ' [{"date":"2024-11-21T00:00:00Z","coef":-1,"wID":195,"Name":"Диски","tName":"Лето","tID":5},{"date":"2024-12-04T00:00:00Z","coef":-1,"wID":225,"Name":"Шины","tName":"Лето","tID":5},{"date":"2024-12-04T00:00:00Z","coef":0,"wID":225,"Name":"Шины","tName":"Зима","tID":6},{"date":"2024-12-04T00:00:00Z","coef":2,"wID":225,"Name":"Шины","tName":"Всесезонка","tID":2},{"date":"2024-11-21T00:00:00Z","coef":-1,"wID":195,"Name":"Диски","tName":"Лето","tID":5},{"date":"2024-11-30T00:00:00Z","coef":-1,"wID":225,"Name":"Шины","tName":"Лето","tID":5},{"date":"2024-11-25T00:00:00Z","coef":0,"wID":195,"Name":"Диски","tName":"Зима","tID":6},{"date":"2024-11-29T00:00:00Z","coef":2,"wID":225,"Name":"Шины","tName":"Всесезонка","tID":2}]'

local $resultX = Json_Decode($dataX)

        if $chk = 1 Then
            If IsArray($resultX) Then
    For $j=0 to UBound($resultX)-1
         $res = $cTime & "  " & _DateTimeFormat(Json_Get($resultX,"[" & $j & "][date]"),2) & "  " & Json_Get($resultX,"[" & $j & "][Name]") & "  " & Json_Get($resultX,"[" & $j & "][coef]") & "  " & Json_Get($resultX,"[" & $j & "][tName]")
            ConsoleWrite($res & @CRLF)
            local $whinfo = $res
                    local $editBefore = GuiCtrlRead($idTEXT) 
            GUICtrlSetData($idTEXT, $whinfo&@CRLF&$editBefore& " ")
    Next
EndIf

        Sleep(2000) 
        else
            Exit
        EndIf
    
     
EndFunc

Func CLOSEClicked()
  Exit
EndFunc

Func OKButton()
        local $cTime = @YEAR & "-" & @MON & "-" & @MDAY &"   " & @HOUR & ":" & @MIN & ":" & @SEC &"   " 
        if $chk = 0 Then
        GUICtrlSetData($iOKButton,"Стоп")
        $whinfo  = $cTime & "  Пошёл процесс!"
        Logging($idTEXT,$whinfo)
        $chk = 1
        Sleep(1000)
        AdlibRegister ("Request",3000)
        else
        AdlibUnRegister ("Request")
        GUICtrlSetData($iOKButton,"Старт")
        $whinfo =$cTime & "  Мониторинг остановлен"
        Logging($idTEXT,$whinfo)
        $chk = 0 
        
        EndIf
EndFunc
 
Последнее редактирование:

johnmarshall

Осваивающий
Сообщения
197
Репутация
35
тихий ужас)
куча ошибок..
на 3.3.16.1 пытался проверить, JSON_UDF с гитхаба ругается, Json_Decode нету, Json_Get нету, $idTEXT, $iOKButton, используются до обьявления...
нет желания даже разбиратся,
вы можете все это поправить для 3.3.16.1 это вроде последняя версия, + библиотеки Json, Encoding, какие версии, откуда, давайте все архивом, с правками, укажите версии..
 
Автор
F

Fanatmb

Новичок
Сообщения
56
Репутация
0
Я признаюсь, сам это увидел только сегодня так, как до этого писал в простом блокноте. Только потом вспомнил, что есть свой редактор. И пару часов назад только установил его полную версию.

Уже данные ошибки исправил.

Было как: возникла задача, Скачал последнюю версию Autoit, установил. С интернета добавил недостающие библиотеки(json с github'a, остальные тут нашел) и все работает. 3 часа назад увидел в консоле сообщения про ошибки, и их изменил. Но, код и без этих исправлений работает, а вопрос про исключение из списка по прежнему открыт.

Версии продуктов (32-bit):


А точно вы взяли JSON, а не JSMN?
 

Вложения

  • 1.7z
    21.3 КБ · Просмотры: 1
Последнее редактирование:

johnmarshall

Осваивающий
Сообщения
197
Репутация
35
Код:
Func Request()
    Local $cTime = @YEAR & "-" & @MON & "-" & @MDAY & "   " & @HOUR & ":" & @MIN & ":" & @SEC & "   "
    Local $dataX = ' [{"date":"2024-11-21T00:00:00Z","coef":-1,"wID":195,"Name":"Äèñêè","tName":"Ëåòî","tID":5},{"date":"2024-12-04T00:00:00Z","coef":-1,"wID":225,"Name":"Øèíû","tName":"Ëåòî","tID":5},{"date":"2024-12-04T00:00:00Z","coef":0,"wID":225,"Name":"Øèíû","tName":"Çèìà","tID":6},{"date":"2024-12-04T00:00:00Z","coef":2,"wID":225,"Name":"Øèíû","tName":"Âñåñåçîíêà","tID":2},{"date":"2024-11-21T00:00:00Z","coef":-1,"wID":195,"Name":"Äèñêè","tName":"Ëåòî","tID":5},{"date":"2024-11-30T00:00:00Z","coef":-1,"wID":225,"Name":"Øèíû","tName":"Ëåòî","tID":5},{"date":"2024-11-25T00:00:00Z","coef":0,"wID":195,"Name":"Äèñêè","tName":"Çèìà","tID":6},{"date":"2024-11-29T00:00:00Z","coef":2,"wID":225,"Name":"Øèíû","tName":"Âñåñåçîíêà","tID":2}]'
    Local $resultX = Json_Decode($dataX)

    Local $res, $j_date, $j_coef, $j_wID, $j_Name, $j_tName, $j_tID

    If $chk = 1 Then
        If IsArray($resultX) Then
            For $j = 0 To UBound($resultX) - 1
                $res = ""
                $j_date = _DateTimeFormat(Json_Get($resultX, "[" & $j & "][date]"), 2)
                $j_coef = Json_Get($resultX, "[" & $j & "][coef]")
                $j_wID = Json_Get($resultX, "[" & $j & "][wID]")
                $j_Name = Json_Get($resultX, "[" & $j & "][Name]")
                $j_tName = Json_Get($resultX, "[" & $j & "][tName]")
                $j_tID = Json_Get($resultX, "[" & $j & "][tID]")


                ;<------- here you can write your conditions ------->
                If $j_coef > 0 Or $j_wID <= 195 Then
                    $res = $j_date & " " & $j_coef & " " & $j_wID & " " & $j_Name & " " & $j_tName & " " & $j_tID
                    ConsoleWrite($res & @CRLF)
                EndIf
                ;<-------------------------------------------------->


                ;$res = $cTime & "  " & _DateTimeFormat(Json_Get($resultX, "[" & $j & "][date]"), 2) & "  " & Json_Get($resultX, "[" & $j & "][Name]") & "  " & Json_Get($resultX, "[" & $j & "][coef]") & "  " & Json_Get($resultX, "[" & $j & "][tName]")
                ;ConsoleWrite($res & @CRLF)

                If $res <> "" Then
                    Local $whinfo = $res
                    Local $editBefore = GUICtrlRead($idTEXT)
                    GUICtrlSetData($idTEXT, $whinfo & @CRLF & $editBefore & " ")
                EndIf
            Next
        EndIf

        Sleep(2000)
    Else
        Exit
    EndIf
EndFunc   ;==>Request
 
Последнее редактирование:
Автор
F

Fanatmb

Новичок
Сообщения
56
Репутация
0
Спасибо.

С одиночным я разобрался, остался вопрос как быть если $j_wID должен соответствовать одному из некоторых значений.
Например:

Код:
$j_wID = '195,202,555,5555,864'


Ну и ваш код, посимпатичнее моего, это факт)
 

johnmarshall

Осваивающий
Сообщения
197
Репутация
35
Код:
Func Request()
    Local $cTime = @YEAR & "-" & @MON & "-" & @MDAY & "   " & @HOUR & ":" & @MIN & ":" & @SEC & "   "
    Local $dataX = ' [{"date":"2024-11-21T00:00:00Z","coef":-1,"wID":195,"Name":"Äèñêè","tName":"Ëåòî","tID":5},{"date":"2024-12-04T00:00:00Z","coef":-1,"wID":225,"Name":"Øèíû","tName":"Ëåòî","tID":5},{"date":"2024-12-04T00:00:00Z","coef":0,"wID":225,"Name":"Øèíû","tName":"Çèìà","tID":6},{"date":"2024-12-04T00:00:00Z","coef":2,"wID":225,"Name":"Øèíû","tName":"Âñåñåçîíêà","tID":2},{"date":"2024-11-21T00:00:00Z","coef":-1,"wID":195,"Name":"Äèñêè","tName":"Ëåòî","tID":5},{"date":"2024-11-30T00:00:00Z","coef":-1,"wID":225,"Name":"Øèíû","tName":"Ëåòî","tID":5},{"date":"2024-11-25T00:00:00Z","coef":0,"wID":195,"Name":"Äèñêè","tName":"Çèìà","tID":6},{"date":"2024-11-29T00:00:00Z","coef":2,"wID":225,"Name":"Øèíû","tName":"Âñåñåçîíêà","tID":2}]'
    Local $resultX = Json_Decode($dataX)

    Local $res, $j_date, $j_coef, $j_wID, $j_Name, $j_tName, $j_tID
    Local $s_wID = '195,202,555,5555,864'

    If $chk = 1 Then
        If IsArray($resultX) Then
            For $j = 0 To UBound($resultX) - 1
                $res = ""
                $j_date = _DateTimeFormat(Json_Get($resultX, "[" & $j & "][date]"), 2)
                $j_coef = Json_Get($resultX, "[" & $j & "][coef]")
                $j_wID = Json_Get($resultX, "[" & $j & "][wID]")
                $j_Name = Json_Get($resultX, "[" & $j & "][Name]")
                $j_tName = Json_Get($resultX, "[" & $j & "][tName]")
                $j_tID = Json_Get($resultX, "[" & $j & "][tID]")


                ;<------- here you can write your conditions ------->
                If $j_coef > 0 Or IsInRange($j_wID, $s_wID) Then
                    $res = $j_date & " " & $j_coef & " " & $j_wID & " " & $j_Name & " " & $j_tName & " " & $j_tID
                    ConsoleWrite($res & @CRLF)
                EndIf
                ;<-------------------------------------------------->


                ;$res = $cTime & "  " & _DateTimeFormat(Json_Get($resultX, "[" & $j & "][date]"), 2) & "  " & Json_Get($resultX, "[" & $j & "][Name]") & "  " & Json_Get($resultX, "[" & $j & "][coef]") & "  " & Json_Get($resultX, "[" & $j & "][tName]")
                ;ConsoleWrite($res & @CRLF)

                If $res <> "" Then
                    Local $whinfo = $res
                    Local $editBefore = GUICtrlRead($idTEXT)
                    GUICtrlSetData($idTEXT, $whinfo & @CRLF & $editBefore & " ")
                EndIf
            Next
        EndIf

        Sleep(2000)
    Else
        Exit
    EndIf
EndFunc   ;==>Request

Func IsInRange(ByRef $i_find, ByRef $s_range)
    local $arr = StringSplit($s_range, ",")
    Local $b_ret = false

    If IsArray($arr) Then

        For $i = 0 To UBound($arr) - 1
            If $arr[$i] == $i_find Then
                $b_ret = True
                ExitLoop
            EndIf
        Next

        return $b_ret
    Else
        return $b_ret
    EndIf
EndFunc
 
Верх