Что нового

Получение "чистого" ответа от сервера

Andrey145

Новичок
Сообщения
25
Репутация
0
Доброго времени суток! с Новогодними праздниками всех!

Не получается решить следующую задачу:
есть ответа от сервера в виде:
Код:
{"result":[]}
{"result":[{"alternative":[{"transcript":"привет как дела","confidence":0.93204647},{"transcript":"777привет как дела а777"}],"final":true}],"result_index":0}

нужно вытащить данные: (которые будут постоянно меняться)
1) привет как дела
2)0.93204647
3)777привет как дела а777
4)0


есть наработка:
Код:
$tt1 = StringRegExpReplace($oHTTP.ResponseText, '.*?transcript":"(.*?)",?.*', '$1 ',3)
но она не доработана - первую строку не отсеивает... и ... в принципе как и дальше :stars:

буду рад помощи...
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Andrey145 [?]
вытащить данные
Код:
$text = '{"result":[]}' & @CRLF & '{"result":[{"alternative":[{"transcript":"привет как дела","confidence":0.93204647},{"transcript":"777привет как дела а777"}],"final":true}],"result_index":0}'

$tt13 = StringRegExp($text, '"transcript":"(.*?)"', 3)
$tt2 = StringRegExp($text, '"confidence":(.*?)}', 3)
$tt4 = StringRegExp($text, '"final":(.*?)}', 3)
$tt5 = StringRegExp($text, '"result_index":(.*?)}', 3)

ConsoleWrite($tt13[0] & @CRLF)
ConsoleWrite($tt2[0] & @CRLF)
ConsoleWrite($tt13[1] & @CRLF)
ConsoleWrite($tt4[0] & @CRLF)
ConsoleWrite($tt5[0] & @CRLF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Andrey145,
Как вариант.
Код:
$sJSON = '{"result":[]}' & @CRLF & '{"result":[{"alternative":[{"transcript":"привет как дела","confidence":0.93204647},{"transcript":"777привет как дела а777"}],"final":true}],"result_index":0}'
$oJSON = ObjCreate('ScriptControl')
$oJSON.Language = 'JavaScript'
$oJSON = $oJSON.Eval('(' & StringRegExpReplace($sJSON, '^.*\r\n', '') & ')')
;~ $oJSON = $oJSON.Eval('(' & StringReplace($sJSON, @CRLF, ',') & ')')
$iCount = 0

For $oRes In $oJSON.result
	For $oAlt In $oRes.alternative
		ConsoleWrite($iCount & ' transcript: ' & $oAlt.transcript & @LF)
		If Not $iCount Then ConsoleWrite('confidence: ' & $oAlt.confidence & @LF)
		$iCount += 1
	Next
	ConsoleWrite('final: ' & $oRes.final & @LF)
Next
ConsoleWrite('result_index: ' & $oJSON.result_index & @LF)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Непонятна логика выборки.
Почему в результат не входит "true" ?
 
Автор
A

Andrey145

Новичок
Сообщения
25
Репутация
0
InnI , спасибо буду пробывать ,
edyapd, искал этот раздел , нашел благодаря тебе,
madmasles , тяжеловат для меня, но если первый не попрет буду пробовать твой,
C2H5OH , не заметил это значение "true" ,
спасибо ребят может седня проверю...

а да! скажите (тыкните) как вставлять имена в ответе ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Andrey145 [?]
не заметил это значение "true"
Добавил в свой вариант.


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

Andrey145 [?]
скажите (тыкните) как вставлять имена в ответе
Слева кликнуть в ник, кликнуть в ? в квадратных скобках - перейти в профиль.
 
Автор
A

Andrey145

Новичок
Сообщения
25
Репутация
0
"true" мне пока не нужно...
че за вариант?! антивариант... :rofl:
не понятно все равно с именем...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Andrey145
И еще вариант.
Код:
#include <Array.au3>

Local $sJSON, $aTmp, $aRes[1], $iUb

$sJSON = '{"result":[]}' & @CRLF & '{"result":[{"alternative":[{"transcript":"привет как дела","confidence":0.93204647},{"transcript":"777привет как дела а777"}],"final":true}],"result_index":0}'

$aTmp = StringRegExp($sJSON, '"([^\[\]\{\}"]+)":"*([^\[\]\{\}"]+)[\[\]\{\}",]', 3)
$iUb = UBound($aTmp)
If (Not $iUb) Or (Mod($iUb, 2)) Then Exit 13
ReDim $aRes[$iUb / 2 + 1][2]
For $i = 0 To $iUb - 1 Step 2
	$aRes[0][0] += 1
	For $j = 0 To 1
		$aRes[$aRes[0][0]][$j] = $aTmp[$i + $j]
	Next
Next
_ArrayDisplay($aRes, 'С ключами')

$aTmp = StringRegExp($sJSON, '"[^\[\]\{\}"]+":"*([^\[\]\{\}"]+)[\[\]\{\}",]', 3)
_ArrayDisplay($aTmp, 'Без ключей')
 
Автор
A

Andrey145

Новичок
Сообщения
25
Репутация
0
Спс, скажите а как лучше грамотно обойти ошибку:
Код:
error: subscript used on non-accessible variable

через
Код:
If Not IsArray($tt4[) Then Return 0

не получается!

Код:
MsgBox (0, "0" , $oHTTP.ResponseText )
$tt1 = StringRegExp($oHTTP.ResponseText, '"transcript":"(.*?)"', 3)
$tt2 = StringRegExp($oHTTP.ResponseText, '"confidence":(.*?)}', 3)
$tt3 = StringRegExp($oHTTP.ResponseText, '"result_index":(.*?)}', 3)
$tt4 = StringRegExp($oHTTP.ResponseText, '"final":(.*?)}', 3)

;If Not IsArray($tt1) Then Return 0

MsgBox (0, " 0 " , $tt1[0] ,  " = " )
MsgBox (0, " 1 " , $tt1[1] ,  " = " )
MsgBox (0, " 2 " , $tt1[2] ,  " = " )
MsgBox (0, " 3 " , $tt1[3] ,  " = " )
MsgBox (0, " 4 " , $tt1[4] ,  " = " )
MsgBox (0, " Confidence " , $tt2[0] ,  " = " )
MsgBox (0, " Index " , $tt3[0] ,  " = " )
MsgBox (0, " Final " , $tt4[0] ,  " = " )
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Andrey145 [?]
Вы хотите сказать, что массив $tt1 не всегда содержит 5 элементов? Поэтому проверка на массив проходит, а обращение к несуществующему элементу приводит к ошибке?
Если так, то читайте элементы в цикле
Код:
If Not IsArray($tt1) Then Return 0
For $i = 0 To UBound($tt1) - 1
  MsgBox(0, $i, $tt1[$i])
Next
 
Автор
A

Andrey145

Новичок
Сообщения
25
Репутация
0
не всегда ответ может содержать что то, может быть пустым, т.е. во всех $tt массивы могу и НЕ БЫТЬ!
нужно обойти ошибку чтобы не выкидывало со скрипта...
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Andrey145 [?]
$tt массивы могу и НЕ БЫТЬ
Если $tt не массив, то IsArray() однозначно это покажет. Можно ещё @error проверять
Код:
$tt = StringRegExp("123", "\D", 3)
If @error Then ConsoleWrite("err1" & @CRLF)
If Not IsArray($tt) Then ConsoleWrite("err2" & @CRLF)
 
Автор
A

Andrey145

Новичок
Сообщения
25
Репутация
0
после практики понял как это работает и получилось:
Код:
MsgBox (0, "0" , $oHTTP.ResponseText )
$tt1 = StringRegExp($oHTTP.ResponseText, '"transcript":"(.*?)"', 3)
$tt2 = StringRegExp($oHTTP.ResponseText, '"confidence":(.*?)}', 3)


If isArray($tt1) Then
MsgBox (0, " 0 " , $tt1[0] ,  " = " )
Else
   MsgBox (0, " 0 " ,  " пусто " )
endif

If isArray($tt1) Then
MsgBox (0, " 1 " , $tt1[1] ,  " = " )
Else
MsgBox (0, " 1 " ,  " пусто " )
endif

If isArray($tt1) Then
MsgBox (0, " 2 " , $tt1[2] ,  " = " )
Else
MsgBox (0, " 2 " ,  " пусто " )
endif

If isArray($tt1) Then
MsgBox (0, " 3 " , $tt1[3] ,  " = " )
Else
MsgBox (0, " 3 " ,  " пусто " )
endif

If isArray($tt1) Then
MsgBox (0, " 4 " , $tt1[4] ,  " = " )
Else
MsgBox (0, " 4 " ,  " пусто " )
endif

If isArray($tt2) Then
MsgBox (0, " Confidence " , $tt2[0] ,  " = " )
Else
MsgBox (0, " Confidence " ,  " пусто " )
endif

спасибо
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Andrey145 [?]
Если количество найденных "transcript" будет меньше пяти, то вы получите ошибку обращения к несуществующему элементу массива. Если больше пяти - не увидите последних элементов. Поэтому лучше сделать так
Код:
MsgBox (0, "0" , $oHTTP.ResponseText)
$tt1 = StringRegExp($oHTTP.ResponseText, '"transcript":"(.*?)"', 3)
$tt2 = StringRegExp($oHTTP.ResponseText, '"confidence":(.*?)}', 3)

If isArray($tt1) Then
  MsgBox(0, " Transcript " , "Всего: " & UBound($tt1))
  For $i = 0 To UBound($tt1) - 1
    MsgBox(0, $i, $tt1[$i])
  Next
Else
  MsgBox (0, " Transcript " , " пусто ")
EndIf

If IsArray($tt2) Then
  MsgBox (0, " Confidence " , $tt2[0])
EndIf
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Andrey145

[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Автор
A

Andrey145

Новичок
Сообщения
25
Репутация
0
Garrett сказал(а):
Andrey145

[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]





извините долго отсутствовал, по работе сложности...
тема не решена, есть еще вопросы, скоро вернусь. не создавать же потом дубль теиы...
 
Верх