Например, у меня есть эта строка из двух 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-объект между двумя пакетами.
Кроме того, несколько советов:
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