使用file_put_contents更新JSON时布尔值被转为字符串的问题
解决Ajax更新JSON布尔值变字符串的问题
我之前也碰到过一模一样的坑!核心问题是数据传输和解析环节没正确处理JSON格式,导致布尔值被当成字符串存进了JSON文件里。下面分客户端和服务端两部分给你搞定:
客户端:确保发送的是JSON格式数据
你用console.log看到的是布尔值,但如果Ajax请求没正确设置格式,浏览器会把数据转成表单编码格式,服务器拿到的就是字符串了。
原生JS示例
const toggleNiceGuy = async () => { // 假设你已经拿到当前的nice_guy状态,这里模拟切换后的值 const newValue = !currentNiceGuyValue; console.log('要发送的布尔值:', newValue); // 这里确实是布尔类型 try { const response = await fetch('/your-update-script.php', { method: 'POST', headers: { 'Content-Type': 'application/json', // 关键:告诉服务器这是JSON数据 }, body: JSON.stringify({ nice_guy: newValue }) // 把数据序列化为JSON字符串 }); const result = await response.json(); console.log('更新结果:', result); } catch (err) { console.error('请求出错:', err); } };
jQuery Ajax示例
const newValue = !currentNiceGuyValue; $.ajax({ url: '/your-update-script.php', method: 'POST', contentType: 'application/json', // 必须设置这个 data: JSON.stringify({ nice_guy: newValue }), dataType: 'json', success: (res) => console.log('更新成功:', res), error: (err) => console.error('请求失败:', err) });
服务端:正确解析JSON并保留布尔类型
不要直接用$_POST!因为$_POST只处理表单编码的数据,JSON请求体得从原始输入流读取:
// 读取客户端发送的JSON原始数据 $jsonInput = file_get_contents('php://input'); $requestData = json_decode($jsonInput, true); // 转成关联数组 // 验证拿到的是布尔值 if (isset($requestData['nice_guy']) && is_bool($requestData['nice_guy'])) { // 读取现有JSON文件 $jsonFilePath = './your-data.json'; $currentData = json_decode(file_get_contents($jsonFilePath), true); // 更新布尔值(此时$requestData['nice_guy']是PHP的布尔类型) $currentData['nice_guy'] = $requestData['nice_guy']; // 写入文件:json_encode默认会把布尔值转成不带引号的true/false file_put_contents($jsonFilePath, json_encode($currentData, JSON_PRETTY_PRINT)); // 返回成功响应 header('Content-Type: application/json'); echo json_encode(['success' => true, 'new_value' => $requestData['nice_guy']]); } else { header('Content-Type: application/json'); echo json_encode(['success' => false, 'error' => '无效的布尔值']); }
为啥之前会变字符串?
你之前的操作大概率是:
- 客户端用默认表单格式发送数据(比如
nice_guy=true),服务器$_POST['nice_guy']拿到的是字符串"true"; - 直接把这个字符串写入JSON,
json_encode自然会把它序列化为带引号的字符串,而不是布尔值。
按上面的步骤改完,就能保证布尔值在整个流程里类型完全正确啦!
内容的提问来源于stack exchange,提问作者Shawn Cooke
相关产品推荐
相关产品推荐

