PHP / AS3 регулярное выражение для разделения нескольких JSON в одном - PullRequest
1 голос
/ 05 мая 2010

Например, у меня есть эта строка из 2 объектов json:

{"glossary": {"title": "example glossary"}, "aaa": "1212"} {"adada": "faka"}

Я хочу разбить его на массив для PHP и Actionscript 3

Array ( 
[0] => '{"glossary": {"title": "example glossary"}', 
[1] => '{"adada": "faka"}' 
)

Какой лучший способ сделать это.

Edit:

Мне не нужен ответ, как разобрать JSON. Для упрощения мне нужно разделить

{... {..} ....} {....} {........}

в

{... {..} ....}

{....}

{........}

Ответы [ 4 ]

2 голосов
/ 07 мая 2015

Извините за публикацию по старому вопросу, но я просто столкнулся с этим вопросом, когда гуглил похожую проблему, и я думаю, что у меня есть довольно простое решение для конкретной проблемы, которая была определена в вопросе.

// Convert original data to valid JSON array
$json = '['.str_replace('}{', '},{', $originalData).']';
$array = json_decode($json, true);

$arrayOfJsonStrings = array();
foreach ($array as $data) {
    $arrayOfJsonStrings[] = json_encode($data);
}
var_dump($arrayOfJsonStrings);

Я думаю, что это должно работать, пока ваши данные JSON не содержат строк, которые могут содержать '} {'.

2 голосов
/ 05 мая 2010

либо вы изменяете синтаксический анализатор JSON, чтобы сделать это, как предложил Амаргош, либо вы можете создать простой алгоритм, который сделает это за вас, который пропускает строки и комментарии и отслеживает открытые скобки. когда не осталось открытых скобок, тогда у вас есть полное значение. повторяйте это, пока не закончите ввод.

однако я предлагаю попытаться решить проблему, поговорив с тем, кто несет ответственность за этот вывод, и убедить его сгенерировать действительный JSON, то есть [{"glossary": {"title": "example glossary"}, "aaa": "1212"},{"adada": "faka"}]

edit: , чтобы отделить объекты JSON, вам нужно поставить префикс перед каждым объектом JSON длиной (должно хватить 4 байта). затем вы считываете сокет, пока не получите нужное количество символов. следующие символы снова будут длиной следующего объекта. это обязательно, потому что TCP работает в пакетах. Вы можете не только иметь несколько JSON-объектов в одном пакете, но вы также можете иметь один JSON-объект, разделенный на два пакета.

Также пара советов:

  • не использовать PHP для серверов сокетов. это не для этого. взгляните на Haxe , в частности на neko backend.
  • не пишите такого рода вещи самостоятельно, если вам действительно не нужно. это скучная и тупая работа. Есть практически миллионы решений для сокет-серверов. Вы также должны взглянуть на Haxe remoting , который позволяет прозрачную связь между, например. Флэш-клиент и сервер сокетов Neko. Также обратите внимание на smartfox и red5.

edit2: вы недооцениваете проблему, и ваш подход не очень хорош. вы должны создать надежное решение, чтобы в тот день, когда вы захотите отправить массивы по проводам, у вас не будет полного отказа, потому что ваш «сплиттер» разрывается, или ваш анализатор JSON получает незавершенные объекты, потому что читается только половина объекта , то, что вы хотите сделать, может быть легко сделано: разбить ввод с помощью "}{", добавить "}" к любому элементу, кроме последнего, и добавить "{" к любому элементу, кроме первого. Тем не менее, я настоятельно рекомендую вам воздержаться от такого подхода, потому что вы пожалеете об этом в какой-то момент. если вы действительно думаете, что должны делать так, думайте сами, то постарайтесь, по крайней мере, сделать это правильно.

1 голос
/ 05 мая 2010

Regex не может справиться с этим. Если вам на самом деле не нужен JSON-анализатор, написание простой функции синтаксического анализа должно сделать это.

Примерно так:

function splitJSONString($json) {
    $objects = array();

    $depth = 0;
    $current = '';

    for ($i = 0; $char = substr($json, $i, 1); $i++) {
        $current .= $char;

        if ($char == '{') {
            $depth += 1;
        } else if ($char == '}' && $depth > 0) {
            $depth -= 1;

            if ($depth == 0) {
                array_push($objects, $current);
                $current = '';
            }
        }           
    }

    return $objects;
}
0 голосов
/ 05 мая 2010

Regex не подходит для этого - используйте JSON Parser

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...