php判断json格式是否正确分析

访客 阅读:136 2021-09-06 11:47:43 评论:0
本文章主要介绍了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的手册。


标签:PHP
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号