我使用此代码对大型(cca 60mb(geojson进行编码,然后再将其存储到数据库:
// 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 = JsonMachineJsonMachine::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...
}
我使用此代码在从数据库中选择字符串后对其进行解码
// 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 "</pre>";
echo json_last_error_msg(); // "syntax error"
echo 'JSON ERROR(from zone):';
echo '<hr>';
echo $json;
die();
}
return $decoded;
}
当我尝试解码它时,我从函数json_last_error_msg收到语法错误消息json_encode函数返回 null。
编辑:
我刚刚意识到字符串var_dumping给了我这个:string(65535( "...
可能是MySql在该长度之后截断了我的JSON,即使im使用文本字段来存储编码的字符串?
65535 是 MySQL 中文本字段的确切长度。如果 json 字符串的长度超过此值,请使用中文本(16,777,215 个字符(或长文本(4,294,967,295 个字符(。
如果你在MySQL数据库中存储JSON数据,你不应该使用text
,也不应该使用mediumtext
,也不应该使用longtext
。 有一个专门为在表中存储 JSON 数据而创建的JSON
数据类型。
我建议更改您的表并将列类型更改为 JSON 而不是任何文本类型。