PHP невозможно декодировать JSON закодировано с помощью json_encode - PullRequest
0 голосов
/ 30 января 2020

Я использую этот код для кодирования 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 для хранения закодированной строки?

Ответы [ 2 ]

2 голосов
/ 30 января 2020

65535 - точная длина текстового поля в MySQL. Если ваша строка json длиннее, используйте средний текст (16 777 215 символов) или длинный текст (4 294 967 295 символов).

1 голос
/ 30 января 2020

Если вы храните данные JSON в вашей базе данных MySQL, вы не должны использовать ни text, ни mediumtext, ни longtext. Существует тип данных JSON, созданный специально для хранения данных JSON в ваших таблицах.

Я бы предложил изменить вашу таблицу и изменить тип столбца на JSON вместо любого типа текста.

...