json_decode如何简单解决解析含有特殊字符的字符串

现在开发接口大多数都是使用的是post一个json字符串过来,然后后端服务进行解析这个json然后做相应的处理,由于接口是开放出去的,调用方使用各种各样的语言来实现,在次就遇到调用方确实post过来一个json字符串,而php就是死活都没有进行对应得业务处理。

进过一番调试后发现在json_decode这块有时就是解析出了个NULL,为什么会出现这样呢,原因有如下几个:

  1. 原字符串中包含非UTF-8编码的字符
  2. 最后元素有逗号
  3. 使用单引号
  4. 包含\t、\t等特殊字符

调用方使用程序进行json编码成字符串的,可以确定2跟3是不可能出现的,那么1跟4是可能出现的,在此可以采用str_replace进行对这些字符替换从而来达到目的,但是这样会丢失部分内容,这不是一个好办法,但是确实是可行的办法,下面要介绍的是另一种方法,既可以保证内容不丢失,又可以保证可以解析,这个方法就是利用php自身带的json_encode,原理就是把里面的非UTF-8编码的字符和\t、\n等特殊字符进行转换,非UTF-8的转换成unicode,特殊字符追加转义符。

实现代码如下:

<?php
$str = file_get_contents("php://input");
$str = substr(str_replace('\"', '"', json_encode($str)), 1, -1); //在此就对特殊字符进行了编码
$arr = json_decode($str, TRUE);

采用以上代码就可以完美的解决上述的问题,如有2或3的话,就只能叫调用方更改json库了,嘿嘿!

发表评论

电子邮件地址不会被公开。 必填项已用*标注