Что нового

Преобразование ответа от сервера в массив!

RogeR31415

10 home 20 sweet 30 goto 10
Сообщения
11
Репутация
0
Получаем данные от сервера:

Код:
$oRequest.Send('request=get-data')
	$sData = $oRequest.ResponseText


...данные типа string такого вида:

Код:
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [Last name] => Pervyi
                    [First name] => Petr
                )

            [1] => Array
                (
                    [Last name] => Pupkin
                    [First name] => Vasya
                )

            [2] => Array
                (
                    [Last name] => TestLast
                    [First name] => TestName
                )

        )

)

Как преобразовать строку в массив вида:

Код:
Array =>     
              array[0] => 
                                 [Last name] => Pervyi
                                 [First name] => Petr
              array[1] => 
                                 [Last name] => Pupkin
                                 [First name] => Vasya

Регулярными выражениями?
 

madmasles

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

;...
;$sData = $oRequest.ResponseText
$sData = FileRead(@ScriptDir & '\1.txt')
$aTemp = StringRegExp($sData, '(?s)(\[Last name\].*?\[First name\][^\r\n]+)', 3)
Dim $a_Ret[UBound($aTemp) + 1] = [UBound($aTemp)]
For $i = 1 To $a_Ret[0]
	$a_Ret[$i] = StringRegExpReplace($aTemp[$i - 1], '\h{2,}', '')
Next
_ArrayDisplay($a_Ret, '1')
;or
Dim $a_Ret_1[UBound($aTemp) + 1][2] = [['Last name', 'First name']]
For $i = 0 To UBound($aTemp) - 1
	$a_Temp = StringSplit(StringStripCR($aTemp[$i]), @LF)
	For $j = 1 To $a_Temp[0]
		$a_Ret_1[$i + 1][$j - 1] = StringReplace(StringStripWS($a_Temp[$j], 7), '[' & $a_Ret_1[0][$j - 1] & '] => ', '')
	Next
Next
_ArrayDisplay($a_Ret_1, '2')
 
Автор
R

RogeR31415

10 home 20 sweet 30 goto 10
Сообщения
11
Репутация
0
Спасибо! Но Не совсем то что хочется... Наверное будет легче получить массив который я хочу с json...

Код:
[{"Last name":"Pervyi","First name":"Petr"},{"Last name":"Pupkin","First name":"Vasya"},{"Last name":"TestLast","First name":"TestName"}]

Теперь регулярку подобрать надо...
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Для последней строки которую вы дали:
Код:
#include <Array.au3>
$sString = '[{"Last name":"Pervyi","First name":"Petr"},{"Last name":"Pupkin","First name":"Vasya"},{"Last name":"TestLast","First name":"TestName"}]'
$aData = StringRegExp($sString,'(?<=\Qname":"\E)([^"]+)',3)
_ArrayDisplay($aData)
 
Автор
R

RogeR31415

10 home 20 sweet 30 goto 10
Сообщения
11
Репутация
0
Спасибо! Класс! Все что просто - гениально. И последнее как поправить шаблон, чтобы возвращался массив даже с элементом который пуст... Например

Код:
[{"Last name":"Pervyi","Phone":"","First name":"Petr"},{"Last name":"Pupkin","Phone":"","First name":"Vasya"},{"Last name":"TestLast","Phone":"65465456","First name":"TestName"}]

А то как сейчас, где пустота пропускает этот элемент, а мне нужно чтобы колво элементов было фиксированым..
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Проблемно найти то чего нет. Вместо этого, могу предложить заменять "ничто" чем нибудь, что найдется первым. Вот например:
Код:
#include <Array.au3>
$sString = '[{"Last name":"Pervyi","Phone":"","First name":"Petr"},{"Last name":"Pupkin","Phone":"","First name":"Vasya"},{"Last name":"TestLast","Phone":"65465456","First name":"TestName"}]'
$aData = StringRegExp($sString,'(?<=\Q":"\E)(?:([^"]+)|.)',3)
_ArrayDisplay($aData)



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

Хотя можно и так: :smile:

Код:
#include <Array.au3>
$sString = '[{"Last name":"Pervyi","Phone":"","First name":"Petr"},{"Last name":"Pupkin","Phone":"","First name":"Vasya"},{"Last name":"TestLast","Phone":"65465456","First name":"TestName"}]'
$aData = StringRegExp($sString,'(?<=\Q":"\E)(?:([^"]+)|)',3)
_ArrayDisplay($aData)
 

MockeR

Знающий
Сообщения
101
Репутация
14
можно и так:

Код:
#include <Array.au3>
$sString = '[{"Last name":"Pervyi","Phone":"","First name":"Petr"},{"Last name":"Pupkin","Phone":"","First name":"Vasya"},{"Last name":"TestLast","Phone":"65465456","First name":"TestName"}]'
$aData = StringRegExp($sString, ':"([^"]*)', 3)
_ArrayDisplay($aData)


или так:

Код:
#include <Array.au3>
$sString = '[{"Last name":"Pervyi","Phone":"","First name":"Petr"},{"Last name":"Pupkin","Phone":"","First name":"Vasya"},{"Last name":"TestLast","Phone":"65465456","First name":"TestName"}]'
$aData = StringRegExp($sString, ':"(.*?)"', 3)
_ArrayDisplay($aData)
 
Автор
R

RogeR31415

10 home 20 sweet 30 goto 10
Сообщения
11
Репутация
0
Круть! Спасибо! А вы как регулярные выражения подбираете? Я в смысле пользуется кто онлайн подбором регулярок, и есть ли вообще такие?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
OffTopic:
в таких случаях остро ощущается нехватка вменяемого парсера для различных форматов, будь то json или xml
 
Верх