json_decode的结果是null

json_decode的结果是null一、前言      突然发现一个接口出了问题,经过排查之后发现是json_decode($str,true)的问题,返回竟然是null。这个问题大家可能都碰到过,出现问题的原因就那么几种,再次记录一下吧二、原因1、首先使用json_last_error确定问题$arrDataList=json_decode($content…

大家好,又见面了,我是你们的朋友全栈君。

一、前言

      突然发现一个接口出了问题,经过排查之后发现是json_decode($str,true)的问题,返回竟然是null。这个问题大家可能都碰到过,出现问题的原因就那么几种,再次记录一下吧

二、原因

1、首先使用json_last_error确定问题

 $arrDataList = json_decode($content, TRUE);
               				 var_dump( json_last_error());

      这段代码会打印出来一个数字,不同的数字代表不同的错误,如下:

json_last_error错误msg对照表:
				0 = JSON_ERROR_NONE
				1 = JSON_ERROR_DEPTH
				2 = JSON_ERROR_STATE_MISMATCH
				3 = JSON_ERROR_CTRL_CHAR
				4 = JSON_ERROR_SYNTAX    // 语法错误
				5 = JSON_ERROR_UTF8

      我这边打印的结果是4,就是语法错误,明确错误之后继续往下找。

2、常规排错

(1)查看编码

 $content = mb_detect_encoding($jsonStr, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));	
$json= mb_convert_encoding($content tent , "UTF-8", "GBK");                //将字符串转为UTF-8 (在知道字符串是gbk的时候使用,如果字符串已经是utf-8了,不要用这个函数)
$json= mb_convert_encoding($str, "UTF-8", "auto"); //未知原编码,通过auto自动检测后,转换编码为utf-8

      无效。

(2)去掉boom头

$jsonArr= json_decode(trim($jsonStr,chr(239).chr(187).chr(191)),true);

      无效。

(3) 格式: json字符串必须用双引号包含

$jsonStr,chr= str_replace("'",  '"',  $jsonStr);

      无效。

(4)url_decode方式解码

  $jsonStr = urlencode(json_encode($jsonStr));
 $content = urldecode($jsonStr);
	转化的结果不再是null,但是json_decode($content , TRUE);  之后,结果仍为字符串。
	我们的目标是结果是数组,因此失败

      无效。

(5)删除反斜杠,防止转义字符

$data = stripslashes(html_entity_decode($info)); 
//$info是传递过来的json字符串
$data = json_decode($data,TRUE);
//这时候$data就是解析后的数组了!
//html_entity_decode() 函数的作用是把 HTML 实体转换为字符。
//stripslashes() 函数的作用是删除反斜杠。

      无效。

(6)字符串太多了?250W个字符

      根据文档,没有设定字符串的限定,只限定了递归深度,普通的解析深度都不会成为问题。

三、最终问题

      在经过一系列的尝试之后,发现以上方法都是无效的,但json数据肯定是不对的。由于这个文件是经过版本控制的,因此查看改文件的修改记录,发现有同事修改过这个文件,导致少了一些东西。少的这部分字符通过以上方式都无法直接解决,直接通过svn还原了,一了百了,世界都安静了。

      不过以上的解决方案还是可以参考的,大部分json解析错误都能解决。

end

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160638.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows Mobile 6.0 SDK和中文模拟器下载

    Windows Mobile 6.0 SDK和中文模拟器下载

    2021年12月14日
    42
  • 一些基本数字图像处理算法

    一些基本数字图像处理算法一些基本数字图像处理算法所有的图像算法都在DIPAlgorithm类中,并且所有算法都为抽象成员函数。我已经按照java注释规范为所有方法添加使用说明注释,具体实现可见于DIPAlgorithm.java,这里只做算法说明。1图像扭曲模仿PS的扭曲功能,通过建立一个三角形映射网格实现对图像的扭曲。如上图,一共设置了45个控制点围成74个三角形网格扭曲即形变处理其实是寻找一个函数,以所…

    2022年5月13日
    43
  • ioctl函数详解_lseek函数

    ioctl函数详解_lseek函数ioctl 函数 本函数影响由fd 参数引用的一个打开的文件。 #include<unistd.h>int ioctl(intfd,intrequest,…/*void*arg*/);返回0 :成功   -1 :出错 第三个参数总是一个指针,但指针的类型依赖于request 参数。我们可以把和网络相关的请求划分为6&nbsp…

    2022年10月17日
    2
  • 【转载】开源项目推荐:Qt有关的GitHub/Gitee开源项目(★精品收藏★)

    【转载】开源项目推荐:Qt有关的GitHub/Gitee开源项目(★精品收藏★)Q 想请教下 Qt5 之后推出的 qml 与之前 qt4 的 ui 开发方式 有冲突吗 我公司开发桌面程序 是两种方式兼用 还是选择其中一种 A 桌面推荐使用 QWidget 触摸式的嵌入式设备推荐使用 QML nbsp Qt 官网下载 文档 http download qt io nbsp 官方 exe 下载 https mirrors tuna tsinghua edu cn qt nbsp 清华

    2025年6月10日
    2
  • leetcode数组汇总_环形数组

    leetcode数组汇总_环形数组原题链接给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和。在此处,环形数组意味着数组的末端将会与开头相连呈环状。(形式上,当0 <= i < A.length 时 C[i] = A[i],且当 i >= 0 时 C[i+A.length] = C[i])此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次。(形式上,对于子数组 C[i], C[i+1], …, C[j],不存在 i <= k1, k2 <= j 其中 k1 % A.leng

    2022年8月9日
    5
  • acwing-91. 最短Hamilton路径(状态压缩dp)

    acwing-91. 最短Hamilton路径(状态压缩dp)给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数 n。接下来 n 行每行 n 个整数,其中第 i 行第 j 个整数表示点 i 到 j 的距离(记为 a[i,j])。对于任意的 x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]≥a[x,z]。输出格式输出一个整数,表示最短 Ha

    2022年8月9日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号