在不使用json_encode的情况下制作正确的JSON字符串

时间:2018-10-01 06:51:43

标签: php json validation

首先,这是一些背景信息:我当前公司的服务器使用旧版本的PHP(这不是升级它的选项),并且不支持json函数。该公司使用专用功能制作了自己的框架,但返回的字符串似乎并不总是有效的JSON字符串。由于缩进,我在SQL请求中遇到解析错误。 这是我们的功能:

function arrayToJSON ($array) {

    $parts = array();
    $is_list = false;
    if ( is_array($array) && !$array ) return '[]' ;

    //Find out if the given array is a numerical array
    $keys = array_keys($array);
    $max_length = count($array)-1;
    if(($keys[0] === 0) and ($keys[$max_length] === $max_length)) {//See if the first key is 0 and last key is length - 1
        $is_list = true;
        for($i=0; $i<count($keys); $i++) { //See if each key correspondes to its position
            if($i != $keys[$i]) { //A key fails at position check.
                $is_list = false; //It is an associative array.
                break;
            }
        }
    }

    foreach($array as $key=>$value) {
        if(is_array($value)) { //Custom handling for arrays
            if($is_list) $parts[] = arrayToJSON($value); /* :RECURSION: */
            else $parts[] = '"' . $key . '":' . arrayToJSON($value); /* :RECURSION: */
        } else {
            $str = '';
            if(!$is_list) $str = '"' . $key . '":';

            //Custom handling for multiple data types
            if(is_int($value) || is_float($value)){
                 $str .= $value; //Numbers
            }elseif($value === false){
                 $str .= 'false'; //The booleans
            }elseif($value === true){
                 $str .= 'true';
            }elseif(is_object($value)){
                $str .= '"' . '"';
            }else{
                 $str .= '"' . str_replace(array('\\', '"',"\r\n","\n"),array('\\\\', '\\"',' ',' '),$value) . '"'; //All other things
            }

            $parts[] = $str;
        }
    }
    $json = implode(',',$parts);

    if($is_list) return '[' . $json . ']';//Return numerical JSON
    return '{' . $json . '}';//Return associative JSON
}

Here is the parsing error.

这是我的JS快速修复:

version = JSON.parse(request.response.replace (/([\s]{4})|[\t]/g, `\\t`)).version;

我所做的解决方法是用\ t替换多个空格,但我想使该函数正常工作。 所以我的问题是:解析错误是由于此函数引起的还是它是我可能错过的其他东西引起的?我该如何使事情顺利?

0 个答案:

没有答案