关于小程序GET的数据中存在json的解决方案

来源:互联网 发布:网络主播沟通技巧 编辑:程序博客网 时间:2024/06/05 11:13

在项目开发中,微信小程序开发

wx.require 中的data 数据中,我尝试使用json 字符串来传递给服务器

既然服务器的接收的数据中正确的。但是无法进行json_decode()

返回的数据:NULL。。


然后使用json_last_error() 来排查。出来的结果是4 (语法错误)

0 = JSON_ERROR_NONE   (没有错误)
1 = JSON_ERROR_DEPTH(到达最大堆栈深度)
2 = JSON_ERROR_STATE_MISMATCH (无效或异常的JSON)
3 = JSON_ERROR_CTRL_CHAR(控制字符错误,可能是编码不对)
4 = JSON_ERROR_SYNTAX(语法错误)
5 = JSON_ERROR_UTF8 (异常的UTF-8字符,也许是因为不正确的编码)


上网百度了很久却没有法子。

解决方法:传输前对数据进行base64 加密,在服务器后台再进行解密就可以了。


问题分析,可能在传输过程中,特殊的字符会进行转码。导致json_decode()不成功

在小程序app.js 添加对应的方法, 调用 app.base64encode(str)即可

base64encode:function(str){    var out,i,len,base64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";    var c1,c2,c3;    len=str.length;    i=0;    out="";    while(i<len){        c1=str.charCodeAt(i++)&0xff;        if(i==len){            out+=base64EncodeChars.charAt(c1>>2);            out+=base64EncodeChars.charAt((c1&0x3)<<4);            out+="==";            break;        }        c2=str.charCodeAt(i++);        if(i==len){            out+=base64EncodeChars.charAt(c1>>2);            out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));            out+=base64EncodeChars.charAt((c2&0xF)<<2);            out+="=";            break;        }        c3=str.charCodeAt(i++);        out+=base64EncodeChars.charAt(c1>>2);        out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));        out+=base64EncodeChars.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6));        out+=base64EncodeChars.charAt(c3&0x3F);    }    return out;},base64decode:function(str){    var c1,c2,c3,c4,base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);    var i,len,out;    len=str.length;    i=0;    out="";    while(i<len){        /* c1 */        do{            c1=base64DecodeChars[str.charCodeAt(i++)&0xff];        }while(i<len&&c1==-1);        if(c1==-1) break;        /* c2 */        do{            c2=base64DecodeChars[str.charCodeAt(i++)&0xff];        }while(i<len&&c2==-1);        if(c2==-1) break;        out+=String.fromCharCode((c1<<2)|((c2&0x30)>>4));        /* c3 */        do{            c3=str.charCodeAt(i++)&0xff;            if(c3==61) return out;            c3=base64DecodeChars[c3];        }while(i<len&&c3==-1);        if(c3==-1) break;        out+=String.fromCharCode(((c2&0XF)<<4)|((c3&0x3C)>>2));        /* c4 */        do{            c4=str.charCodeAt(i++)&0xff;            if(c4==61) return out;            c4=base64DecodeChars[c4];        }while(i<len&&c4==-1);        if(c4==-1) break;        out+=String.fromCharCode(((c3&0x03)<<6)|c4);    }    return out;},utf16to8:function(str){    var out,i,len,c;    out="";    len=str.length;    for (i=0;i<len;i++){        c=str.charCodeAt(i);        if((c>=0x0001)&&(c<=0x007F)){            out+=str.charAt(i);        } else if(c>0x07FF){            out+=String.fromCharCode(0xE0|((c>>12)&0x0F));            out+=String.fromCharCode(0x80|((c>>6)&0x3F));            out+=String.fromCharCode(0x80|((c>>0)&0x3F));        } else {            out+=String.fromCharCode(0xC0|((c>>6)&0x1F));            out+=String.fromCharCode(0x80|((c>>0)&0x3F));        }    }    return out;},utf8to16:function(str){    var out,i,len,c;    var char2,char3;    out="";    len=str.length;    i=0;    while(i<len){        c=str.charCodeAt(i++);        switch (c>>4){        case 0:        case 1:        case 2:        case 3:        case 4:        case 5:        case 6:        case 7:            // 0xxxxxxx            out+=str.charAt(i-1);            break;        case 12:        case 13:            // 110x xxxx   10xx xxxx            char2=str.charCodeAt(i++);            out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));            break;        case 14:            // 1110 xxxx  10xx xxxx  10xx xxxx            char2=str.charCodeAt(i++);            char3=str.charCodeAt(i++);            out+=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));            break;        }    }    return out;}

php后端

进行base64decode解密即可

原创粉丝点击