php判断json格式是否正确

1、校验json格式是否有误:

function data($value) {
    $res = json_decode($value, true);
    $error = json_last_error();
    if (!empty($error)) {
        echo "<pre>";
        print_r($value);
        echo "</pre>";
    }
    return $res;
}

延伸:json_last_error可以判断返回 JSON 编码解码时最后发生的错误。 错误如下:有对应的数字编码,但是只要非空,就表示有错误,对于一般的json格式校验来说,已经足够了!
这里写图片描述

0 = JSON_ERROR_NONE No error has occurred

1 = JSON_ERROR_DEPTH The maximum stack depth has been exceeded

2 = JSON_ERROR_STATE_MISMATCH Invalid or malformed JSON

3 = JSON_ERROR_CTRL_CHAR Control character error, possibly incorrectly encoded

4 = JSON_ERROR_SYNTAX Syntax error

5 = JSON_ERROR_UTF8 Malformed UTF-8 characters, possibly incorrectly encoded PHP 5.3.3

人性化的输出json错误!
<?php
     if (!function_exists('json_last_error_msg')) {
         function json_last_error_msg() {
             static $ERRORS = array(
                 JSON_ERROR_NONE => 'No error',
                 JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
                 JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
                 JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
                 JSON_ERROR_SYNTAX => 'Syntax error',
                 JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
             );

             $error = json_last_error();
             return isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error';
         }
     }

2、带中文字的数组转json方法一(推荐)

加参数:JSON_UNESCAPED_UNICODE
$array = array('key' => 'value', 'test' => array('测试一下', 2, 3));
echo "<pre>";
print_r(json_encode($array, JSON_UNESCAPED_UNICODE));
echo "</pre>";
exit;

这里写图片描述

3、另一种方法将带中文字的数组转json方法:

//将汉字,特殊字符原样变成json数据
function ch_json_encode($data) {
    $ret = ch_urlencode($data);
    $ret = json_encode($ret);
    return '\'' . addslashes(urldecode($ret)) . '\'';
}
//汉字,特殊字符变可读懂的字符串主程序
function ch_urlencode($data) {
    if (is_array($data) || is_object($data)) {
        foreach ($data as $k => $v) {
            if (is_scalar($v)) {
                if (is_array($data)) {
                    $data[$k] = urlencode($v);
                } else if (is_object($data)) {
                    $data->$k = urlencode($v);
                }
            } else if (is_array($data)) {
                $data[$k] = ch_urlencode($v); // 递归调用该函数
            } else if (is_object($data)) {
                $data->$k = ch_urlencode($v);
            }
        }
    }
    return $data;
}

php5.2以后自带json_decode函数,但是对json文本串的格式要求非常严格。

很可能使用该函数得到的返回值是NULL,没有返回数组只有可能要么是编码问题,要么就是json返回的数据又特殊字符别无其他原因,下面是解决方法:

可以使用使用json_last_error()函数获取到的返回值来帮助我们判断出问题的原因。

其中如果提示错误JSON_ERROR_SYNTAX(Syntax error),表示json串格式错误。

可以通过以下几个方式排错:

  1. json字符串必须以双引号包含
$output = str_replace("'", '"', $output);
  1. json字符串必须是utf8编码
$output = iconv('gbk', 'utf8', $output);

3.不能有多余的逗号 如:[1,2,],用正则替换掉

preg_replace('/,\s*([\]}])/m', '$1', $output)

4、不能有换行、制表符:这个非常坑,经常排除了所有的错误还是出不来,就是这个地方,多了个换行符啥的,尤其是在excel编辑之后再导入到数据库,然后再用php取出的时候!

$jsonstr = '

{"succ":true,"data":{"id":"31","keywords":"","description":"","jianjie":"       ","jianjie_short":"bb","nav":"ccc","deleted":"0","url":"http:\/\/travel.sina.com.cn\/beijing\/

"}}';

//$ret=preg_replace("/\t/", " ", $ret);  

//$jsonstr = preg_replace("/\n/", ' ', $jsonstr);

$jsonstr = str_replace("\n", ' ', $jsonstr);

//print_r($jsonstr);exit;

//$jsonstr = str_replace ('\n','', $jsonstr);

$jd = json_decode($jsonstr,true);

$errorinfo = json_last_error();

//print_r(JSON_ERROR_DEPTH);

print_r($jd);

当对UTF-8编码的文件进行操作时,如果要把读取的内容当作文本内容来处理,最好先对BOM进行一些处理,这个问题在PHP6中得到了解决(可以设置文本/二进制读取模式),有兴趣的朋友可以自己查找PHP6的手册。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来给你提供一份示例代码,希望能对你有所帮助。 HTML代码: ``` <form id="register-form" action="register.php" method="post"> <input type="text" name="username" placeholder="请输入账号"> <input type="text" name="phone" placeholder="请输入手机号"> <input type="text" name="captcha" placeholder="请输入验证码"> <img id="captcha-img" src="captcha.php" onclick="this.src='captcha.php?'+Math.random();" alt="验证码"> <input type="submit" name="submit" value="注册"> </form> <div id="error-msg"></div> ``` JavaScript代码: ``` <script> $(function() { // 监听表单提交事件 $("#register-form").submit(function(event) { event.preventDefault(); // 阻止表单默认提交行为 // 获取用户输入的账号、手机号和验证码 var username = $("input[name='username']").val(); var phone = $("input[name='phone']").val(); var captcha = $("input[name='captcha']").val(); // 发送 Ajax 请求到后端校验 $.ajax({ type: "POST", url: "register.php", data: { username: username, phone: phone, captcha: captcha }, dataType: "json", success: function(response) { if (response.status === "success") { // 注册成功,跳转到登录页面 window.location.href = "login.php"; } else { // 注册失败,显示错误信息 $("#error-msg").text(response.message); // 如果是验证码错误,则将验证码文本框显示为红色 if (response.type === "captcha") { $("input[name='captcha']").css("border-color", "red"); } } } }); }); }); </script> ``` PHP代码: ``` <?php // 数据库连接信息 $host = "localhost"; $username = "root"; $password = "password"; $dbname = "test"; // 获取用户输入的账号、手机号和验证码 $username = $_POST["username"]; $phone = $_POST["phone"]; $captcha = $_POST["captcha"]; // 连接数据库 $conn = mysqli_connect($host, $username, $password, $dbname); if (!$conn) { die("连接失败: " . mysqli_connect_error()); } // 检查账号是否已经被注册 $sql = "SELECT * FROM users WHERE username='$username'"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { $response = array("status" => "error", "type" => "username", "message" => "该账号已经被注册过了!"); echo json_encode($response); exit(); } // 校验验证码 session_start(); if ($captcha !== $_SESSION["captcha"]) { $response = array("status" => "error", "type" => "captcha", "message" => "验证码错误,请重新输入!"); echo json_encode($response); exit(); } // 将用户信息插入到数据库中 $sql = "INSERT INTO users (username, phone) VALUES ('$username', '$phone')"; if (mysqli_query($conn, $sql)) { $response = array("status" => "success", "message" => "注册成功!"); echo json_encode($response); } else { $response = array("status" => "error", "message" => "注册失败,请稍后重试!"); echo json_encode($response); } // 关闭数据库连接 mysqli_close($conn); ?> ``` 这份代码实现了以下功能: - 用户输入账号、手机号和验证码,点击“注册”按钮提交表单; - 前端使用 JavaScript 发送 Ajax 请求到后端 PHP 代码进行校验; - 后端 PHP 代码中,先检查账号是否已经被注册过,如果已经被注册,则返回错误信息; - 如果账号没有被注册过,就校验用户输入的验证码,如果验证码错误,则返回错误信息; - 如果验证码正确,则将用户信息插入到数据库中,返回注册成功信息。 如果有需要的话,你可以根据自己的业务需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SHUIPING_YANG

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值