PHP中JSON元素传递至另一JSON对象返回null问题排查
问题原因及修复方案
主要问题出在这几个地方:
- 未正确读取1.json的内容:代码里直接把文件名
"1.json"传给json_decode(),但这个函数需要的是文件内的JSON字符串内容,不是文件名。导致$array始终为null,后续遍历找不到匹配的Id,getInfo()返回null,最终写入2.json的都是无效的null。 - Id类型不匹配:URL传入的
id是字符串类型,而JSON里的Id是数字类型,虽然==会做隐式转换,但可能在部分场景下导致匹配失败,建议统一类型后再比较。 - 读取2.json时未转为数组:默认
json_decode()返回对象,用array_push()操作对象会引发错误,需要添加第二个参数true将其转为关联数组。 - 无匹配Id时函数无明确返回:
getInfo()如果没找到对应Id,默认返回null,会导致无效内容被写入2.json。
修正后的代码
<?php // 获取Id并转为数字,避免类型不匹配问题 $subjectId = isset($_GET['id']) ? (int)$_GET['id'] : 0; // 正确读取1.json内容后再解码 $jsonContent = file_get_contents("1.json"); $array = json_decode($jsonContent, true); $result = getInfo($subjectId, $array); function getInfo($id, $array) { // 先判断数组是否有效,防止遍历null报错 if (!is_array($array)) { return null; } foreach($array AS $element) { // 严格比较类型和值,确保匹配准确 if(isset($element["Id"]) && $element["Id"] === $id) { return $element; } } // 未找到匹配项时明确返回null return null; } // 处理2.json的写入逻辑 if(filesize("2.json") == 0){ $data_to_save = [$result]; }else{ $old_records = json_decode(file_get_contents("2.json"), true); // 确保old_records是数组,避免意外错误 if (!is_array($old_records)) { $old_records = []; } // 仅当找到有效数据时才添加 if ($result !== null) { array_push($old_records, $result); } $data_to_save = $old_records; } $encoded_data = json_encode($data_to_save, JSON_PRETTY_PRINT); if(!file_put_contents("2.json", $encoded_data, LOCK_EX)){ $error = "存储消息失败,请重试"; }else{ $success = "消息存储成功"; } ?>
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

