php / as3 regex для разделения нескольких json в одном

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

{"глоссарий": {"title": "example glossary"}, "aaa": "1212"} {"adada": "faka"}

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

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

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

Редактировать:

Мне не нужно отвечать, как разбирать json. Чтобы упростить, мне нужно разделить

{… {..} ….} {….} {……..}

в

{… {..} ….}

{….}

{……..}

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

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

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

Кроме того, несколько советов:

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

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

Greetz
back2dos

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; } 

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

 // 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 не содержат строк, которые могут включать '} {'.

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