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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Sql 语句中 IN 和 EXISTS 的区别及应用「建议收藏」

    Sql 语句中 IN 和 EXISTS 的区别及应用「建议收藏」演示demo表:student表DROPTABLEIFEXISTS`student`;CREATETABLE`student`(`stuid`varchar(16)NOTNULLCOMMENT’学号’,`stunm`varchar(20)NOTNULLCOMMENT’学生姓名’,PRIMARYKEY(`stuid`))ENGINE=In…

    2022年7月27日
    7
  • Unity 安装失败原因

    Unity 安装失败原因文件路径中含有中文,会乱码,导致安装失败\color{red}{文件路径中含有中文,会乱码,导致安装失败}文件路径中含有中文,会乱码,导致安装失败把文件路径换成没有中文的就好了!\color{red}{把文件路径换成没有中文的就好了!}把文件路径换成没有中文的就好了!…

    2022年6月27日
    396
  • laravel中如何在模型中自关联?

    laravel中如何在模型中自关联?

    2021年11月8日
    38
  • redis 击穿 穿透_redis穿透击穿雪崩

    redis 击穿 穿透_redis穿透击穿雪崩本文分享自华为云社区《【高并发】什么是缓存穿透?击穿?雪崩?如何解决?》,作者:冰河。缓存穿透首先,我们来说说缓存穿透。什么是缓存穿透呢?缓存穿透问题在一定程度上与缓存命中率有关。如果我们的缓存设计的不合理,缓存的命中率非常低,那么,数据访问的绝大部分压力都会集中在后端数据库层面。什么是缓存穿透?如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。我们可以使用下图来表示缓存穿透的现象。造成缓

    2025年11月16日
    2
  • 函数指针,指针函数,返回值为指针的函数「建议收藏」

    函数指针,指针函数,返回值为指针的函数「建议收藏」在学习C语言时,一个比较容易混淆的概念就是函数指针、指针函数、返回值为指针的函数。本文将对这三个概念进行区分。指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同。函数指针就是一个指向函数的指针,本质上是一个指针,只是这个指针指向的对象是函数,而不是一般意义上的存储对象。

    2022年6月22日
    32
  • vscode代码自动提示_vscode智能提示

    vscode代码自动提示_vscode智能提示VSCode自动补全,VSCode当中的自动补全内容,其实是由语言服务来提供的。本文介绍VSCode自动补全功能和VSCode自动补全设置。VSCode为编程语言工作者提供了统一的API,即LanguageServerProtocol,每种语言都能够通过实现这个API在VSCode上得到类似IDE的开发体验,而各个语言根据这个API实现的服务,就被称为语言…

    2025年8月19日
    3

发表回复

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

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