如何从多层嵌套JSON中取值并存储为PHP变量用于SQL入库?
从多层嵌套JSON提取值并存入PHP+SQL的实现方法
当然可行啦!多层嵌套JSON的取值其实没你想的那么复杂,我来一步步给你捋清楚怎么做~
步骤1:解析JSON为PHP可操作的结构
首先你得把JSON字符串转换成PHP能直接访问的数组或者对象,这一步用json_decode()函数就能搞定:
- 如果转成关联数组(推荐新手用,键名访问更直观),就在第二个参数传
true:
// 假设你的JSON数据存在$jsonString变量里 $jsonData = json_decode($jsonString, true); // 可以先打印看看结构,方便排查问题 // print_r($jsonData);
- 如果转成对象,就不用传第二个参数,用
->访问属性:
$jsonData = json_decode($jsonString);
步骤2:提取嵌套的目标值
根据你给出的JSON结构,features大概率是一个数组(比如常见的GeoJSON格式里features都是数组元素),所以提取值的时候要注意层级:
用关联数组的写法:
// 先确保层级存在,避免报错 if (isset($jsonData['features'][0]['attributes'])) { // 提取并清理前后空格(你的示例值有多余空格) $masterIncidentNum = trim($jsonData['features'][0]['attributes']['Master_Incident_Number']); $incidentType = trim($jsonData['features'][0]['attributes']['IncidentType']); } else { // 处理结构不存在的情况,比如给默认值或者抛出提示 $masterIncidentNum = null; $incidentType = null; }
用对象的写法:
if (isset($jsonData->features[0]->attributes)) { $masterIncidentNum = trim($jsonData->features[0]->attributes->Master_Incident_Number); $incidentType = trim($jsonData->features[0]->attributes->IncidentType); } else { $masterIncidentNum = null; $incidentType = null; }
小提醒:如果你的
features不是数组,而是单个对象,就去掉[0]直接访问就行~
步骤3:将变量存入SQL数据库
这里一定要用预处理语句!绝对不要直接把变量拼进SQL字符串里,不然容易被SQL注入攻击,安全性极低。下面给你用PDO(PHP数据对象,推荐的数据库操作方式)的示例:
// 1. 连接数据库(替换成你的数据库信息) $dsn = 'mysql:host=你的数据库地址;dbname=数据库名;charset=utf8mb4'; $username = '用户名'; $password = '密码'; try { $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die('数据库连接失败:' . $e->getMessage()); } // 2. 准备预处理SQL语句(假设你的表名是incidents,字段对应) $sql = "INSERT INTO incidents (master_incident_number, incident_type) VALUES (:masterNum, :incidentType)"; $stmt = $pdo->prepare($sql); // 3. 绑定变量并执行 $stmt->bindParam(':masterNum', $masterIncidentNum, PDO::PARAM_STR); $stmt->bindParam(':incidentType', $incidentType, PDO::PARAM_STR); $stmt->execute(); echo '数据存入成功!';
额外注意事项
- 一定要检查
json_decode()的返回值,如果JSON格式错误,它会返回null,可以用json_last_error()排查问题; - 提取值前用
isset()或者array_key_exists()检查层级是否存在,避免出现「Undefined index」或者「Undefined property」的错误; - 存入数据库前记得做数据验证,比如确认
$masterIncidentNum不为空,或者符合预期格式,保证数据的有效性。
内容的提问来源于stack exchange,提问作者Cooper Davies
相关产品推荐
相关产品推荐

