Я использую этот код для кодирования large (cca 60mb) geo json перед сохранением его в базе данных:
// controller
public function importZones () {
ini_set('max_execution_time', '0');
ini_set('memory_limit', '-1');
ini_set("precision", -1);
ini_set("serialize_precision", -1);
$this->load->helper('url');
$filePath = base_url('assets/zones/zone.geojson');
$jsonStream = \JsonMachine\JsonMachine::fromFile($filePath, "/features");
$this->PolygonModel->import($jsonStream)
}
// model
public function import ($jsonStream) {
$import = [];
foreach ($jsonStream as $name => $data) {
// $coordinates is nested indexed array with possibly thousands of elements
$coordinates = json_encode($data['geometry']['coordinates']);
$import['baz'][] = [
'foo' => 'bar',
'coordinates' => $coordinates
];
}
echo json_last_error_msg(); // gives no errors
// insert encoded data to db...
}
Я использую этот код для декодирования строка после ее выбора из базы данных
<code>// decode and fix json if corrupted (huge arrays..)
private function decodeZoneCoords ($coordsJson) {
$decoded = json_decode($coordsJson, true);
if (!$decoded) {
// some fixes I've found online
$json = $coordsJson;
// before removing cntrl I get the “Control character error, possibly incorrectly encoded” error
$json = preg_replace('/[[:cntrl:]]/', '', $coordsJson);
$json = preg_replace('/[[:^print:]]/', '', $coordsJson);
$json = mb_convert_encoding($json, "UTF-8");
$json = ltrim($json . '"' . "]", '1');
if (0 === strpos(bin2hex($json), 'efbbbf')) {
$json = substr($json, 3);
}
$decoded = json_decode($json, true);
if (!$decoded) {
$json = rtrim($json, ',"]') . '"]';
$decoded = json_decode($json, true);
}
}
if (!$decoded) {
echo "<pre>";
var_dump( json_decode($json, true) ); // null
echo "
"; echo json_last_error_msg (); //" синтаксическая ошибка "echo 'JSON ERROR (из зоны):'; echo '
'; echo $ json; d ie ();} return $ decoded;
}
Когда я пытаюсь его декодировать, я получаю сообщение об ошибке синтаксиса от функции json_last_error_msg, а функция json_encode возвращает ноль.
Редактировать:
Я только что понял, что var_dumping строки дает мне это: string (65535) "...
Может быть, MySql усекает my JSON после этой длины, хотя я использую поле text для хранения закодированной строки?