json转php可能碰到的坑

json文件转成php数据文件,主要转换步骤如下:
1、json_decode

$content = json_decode(file_get_contents($originJsonDir . $fileName),true,10,JSON_OBJECT_AS_ARRAY);

3、var_export

var_export($item,true);

转换后会出现问题:
问题1:json数组转php,会自动带下标
解决办法:自己手动去除下标,拼装字符

问题2:json数组中同时有string、int
解决办法:挨个元素判断类型,string需要添加双引号

function outputIndexArrString($indexArr){
    $values = array_values($indexArr);
    //遍历处理
    $resultValues=[];
    foreach ($values as $elem){
        if(is_string($elem)) {//string加上双引号
            $resultValues[] =  '"' . $elem . '"';
        } else {
            $resultValues[] =  $elem;
        }
    }
    return 'array( ' . implode(',',$resultValues) . ' )';
}

问题3:json中map的key由字符变为数字
解决办法:先用特殊字符替换,最后再替换回来

 //数组处理
            if(is_array($subItem)){
                if(isIndexArr($subItem)){//索引数组提前处理成字符串
                    $item[$subKey] = outputIndexArrString($subItem);
                }
                else{//关联数组处理,所有的key加特殊字符,保障key不会转换为int
                    $subItemKeys=[];
                    foreach ($subItem as $sonKey => $sonItem) {
                        if(is_numeric($sonKey)){
                            $subItemKeys[] = '!#!'.$sonKey;//使用特殊字符标记
                        } else{
                            $subItemKeys[] = $sonKey;
                        }
                    }
                    if(count($subItemKeys)) $item[$subKey] = array_combine($subItemKeys,array_values($subItem));
                }
            }
        }
 //去掉关联数组 key中特殊字符
        $row = str_replace('!#!','',$row);

问题4:value中含有\n被替换掉(解决思路参考问题3)
问题5:string的value中含有单引号、双引号被替换掉(解决思路参考问题3)

问题6:16进制被替换成10进制
解决办法:使用dechx函数转换回来

$key = '0x' . str_pad(dechex( $key),8,'0',STR_PAD_LEFT);

问题7:float小数点精度变了
解决办法:修改php.ini中serialize_precision的值小于17

serialize_precision = 14

你可能感兴趣的:(json转php可能碰到的坑)