这种json字符串PHP如何解析?

发布于 2022-09-05 09:31:19 字数 738 浏览 18 评论 0

{"response_time":8999,"object":"http://10.1.17.61:80/v1/verify"},{"response_time":17000,"object":"http://10.1.17.61:80/v1/verify"}],"err_query":[],"resource_type":8,"request_count":6870,"response_time_total":7152990,"response_time":{"start_0_end_1000000":6870},"resource_name":"http://[rpc]token-internal.user.wxsqidc.cn/[10.1.17.61:80]/v1/verify","http_status_code":{"200":6870},"cross_machine_room":"\xE5\xB9\xBF\xE5\xB7\x9E\xE4\xB8\xAD\xE8\x83\xBD-->\xE5\xB9\xBF\xE5\xB7\x9E\xE4\xB8\xAD\xE8\x83\xBD"}

就是字符串里带了很多 \x**的东西,导致 PHPjson_decode失败,我只知道 \x5C 就是反斜杠 " \x22就是单个双引号" 那么其它呢,如何解决?

---后面补充 :
查到了,\x** 的东西就是 16进制字符,有一个在线转码网站,复制进去转出来是乱码来的,字符内容是其它人上报过来的,叫他们上报进规范处理可能可能使自己工作比较被动,那么,自己就无法处理了吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

日裸衫吸 2022-09-12 09:31:19

在加密时单独对这个属性使用 urlencode 试试

怀念你的温柔 2022-09-12 09:31:19

将 xE5xB9xBFxE5xB7x9ExE4xB8xADxE8x83xBD 里的x去掉,然后用 hex2bin($str) 可以将16进制转换为字符串。

无法decode的问题可以用str_replace 将x 替换为 \x或者空,就可以decode了,然后再对16进制字符进行上述处理就可以得到中文 "广州中能"

何处潇湘 2022-09-12 09:31:19
  1. 要求这个接口提供标准的json数据

  2. 使用以下函数替换一下

$str = "\\xE5\\xB9\\xBF\\xE5\\xB7\\x9E\\xE4\\xB8\\xAD\\xE8\\x83\\xBD-->\\xE5\\xB9\\xBF\\xE5\\xB7\\x9E\\xE4\\xB8\\xAD\\xE8\\x83\\xBD";

$rs = preg_replace_callback('/\\\\x(\w{2})/', function ($m) {
    return hex2bin($m[1]);
}, $str);

var_dump($rs);
红焚 2022-09-12 09:31:19

你的json数据都没复制对吧,数据明显有问题,我只截取了16进制那块,代码如下:

$json = '{"cross_machine_room":"\xE5\xB9\xBF\xE5\xB7\x9E\xE4\xB8\xAD\xE8\x83\xBD-->\xE5\xB9\xBF\xE5\xB7\x9E\xE4\xB8\xAD\xE8\x83\xBD"}';

// 将16进制转10进制
$json2 = preg_replace_callback("/\\\[xA-F0-9]{3}/", function($match) {return hexdec($match[0]);}, $json);
$data = json_decode($json2, true);
心房敞 2022-09-12 09:31:19

感觉以个各位大神帮助。其实问题我找到了,也解决了。
并不是上述 \x** 的的问题,PHP是有能力对这些字符转成正常字符的,我的问题是出在一些非utf8范围的字符上,
我用网上找到的一个方法,把非UTF8范围的字符去掉就OK了。
好东西不敢私藏,贴上与大家分享

    function jsondecode_errorrepair($some_string, $replace_string="") {
        //reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
        $some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
         '|[\x00-\x7F][\x80-\xBF]+'.
         '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
         '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
         '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
         $replace_string, $some_string );
         
        //reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
        $some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
         '|\xED[\xA0-\xBF][\x80-\xBF]/S',$replace_string, $some_string );

        return $some_string;
    }

出处是https://magp.ie/2011/01/06/re...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文