苏州软件开发根据最近的项目经历总结出处理json值中的双引号问题。
我们都只json是键值对存储的,php在解析json字符串时直接使用自带的函数json_decode($jsonString)即可实现,解析后的是json对象,非常简单;如果要转成数组也很简单,多加个参数,json_decode($jsonString,true).
最近在项目中遇到个json解析的问题,就是json的value (值)含有双引号,因为值的内容是html代码,按照正常的处理逻辑,双引号在转成json字符串时要进行转义,这样解析的时候就不会有问题,但是实际上却没有进行转义,从而导致json无法解析。因为这是一个接口,我们无法预知内容的多少,所以必须要彻底解决。问题json 代码如下:
{... "detail":"<img align="absmiddle" src="https://img.demo.com/xxx/i1/3252495915/O1CN019CuEk71tZ7DJ0QcF6_!!3252495915.jpg"><img src="https://img.demo.com/xxx/i1/3252495915/O1CN01T7WRWm1tZ7DUVCMd4_!!3252495915.jpg" align="absmiddle">", "count":"876", ...}
可以看到,键 “detail”对应的值双引号内还有双引号,现在需要把值内的双引号进行转义。
也曾百度解决办法,但是大都千篇一律,有的说用addslashes(),但是会破坏json格式,无法解决,也有的说用js处理,但是都已没有真正的解决方法,所以只能自己想办法解决。
首先想到的是通过正则表达式进行处理,但是如何只把上面的“detail”的value部分找出,然后把其中内嵌的双引号进行替换转义,想了很多、也尝试写了很多正则表达式去处理,但是都不理想;最后想出了个方案,还是通过正则,但是采用多个正则进行配合的方式,逻辑如下:
1.全局正则替换双引号,进行转义为\”;
2.全局正则替换起始的双引号;
3.全局正则替换key和value之间的双引号;
4.全局正则替换key和value的双引号,value是数组;
5.全局正则替换key和value的双引号,value是键值对;
6.全局正则替换单行结尾的引号和逗号;
7.替换单行结尾的引号;
通过以上7步即可实现value中双引号转义,而不破坏json格式,json可以正常解析,此方法经多次测试,完全没有问题,具体代码如下:
function escapeDoubleQuote($data){ $data = preg_replace('/\"/','\\\\"', $data); //所有的双引号进行转义 $data = preg_replace('/\s\\\"/','"', $data); //替换起始的双引号 $data = preg_replace('/\\\":\\\"/','":"', $data); //替换key和value之间的双引号 $data = preg_replace('/\\\":\[/','":[', $data); //替换key和value的双引号,value是数组 $data = preg_replace('/\\\":\{/','":{', $data); //替换key和value的双引号,value是键值对 $data = preg_replace('/\\\",/','",', $data); //替换单行结尾的引号和逗号 $data = preg_replace("/\\\\\"\s*\n/","\"\n", $data); //替换单行结尾的引号 $data = json_decode($data,true); return $data; }
为了解决这个问题,花了我们不少时间去思考,才想出这个解决方案,为了帮助有需要的人,现在分享给大家,欢迎转载让更多人知道。
此文为技术人员原创,如需转载请注明出处:苏州滴答软件科技–技术博客, 出处网址:https://www.didasoft.cn/2019/01/08/phpchulijsonzhizhongdeshuangyinhaoyinhao/
苏公网安备 32059002004131号