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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 什么是债券久期[通俗易懂]

    什么是债券久期[通俗易懂]在做债券的投资分析中经常出现的一个词汇——债券久期,之前更多地是专注于开发,并不明白数字背后的业务含义,今天特意梳理下并做个记录。百度百科的解释:久期也称持续期,是1938年由F.R.Macaula

  • Lamda架构研究「建议收藏」

    Lamda架构研究「建议收藏」Lamda架构学习一、Lamda架构介绍Lambda架构整合离线计算和实时计算,融合不可变性(Immutability),读写分离和复杂性隔离等一系列架构原则,可集成Hadoop,Kafka,Storm,Spark,HBase等各类大数据组件。Lambda架构的目的是为应用程序提供一个低延迟的复合异步数据传输环境,例如新闻类应用,经常需要进行大规模信息处理,包括输入,归类,索引,存储等

  • java protostuff 序列化_使用Protostuff序列化

    java protostuff 序列化_使用Protostuff序列化序rpc调用,有多种序列化的方式,通用如json,mongodb使用的bson;java方面的,比如Java默认的序列化,比如hessian;还有跨语言的,比如thrift、protocolbuf。thrift和pb的好处是序列化后size比较小,但是缺点是得生成java代码,这个挺鸡肋的,所以不管二者运行时效率有多高,开发效率相对比较低的。像hessian,是有一些在用,但是感觉不如pb那样强大…

  • 真正的java的四舍五入

    真正的java的四舍五入原文地址:https://blog.csdn.net/qwfylwc/article/details/53939906下面列举让你惊讶的现象,或许你还一直这么用:1、使用Math.round()doubled=1041.735;d=Math.round(d*100)/100.0;//除以100.0而不是100System.out.println(d);…

  • 乌班图下压缩文件的处理

    乌班图下压缩文件的处理

  • RAID0、RAID1及RAID5的区别详解

    RAID0、RAID1及RAID5的区别详解目前已有的RAID(RedundantArrayofIndependentDisks,独立冗余磁盘阵列)技术有很多种,但是RAID0、RAID1、RAID5是最常见的几种方案。1、RAID0RAID0技术把多块(至少两块)物理硬盘设备通过软件或硬件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。这样,在最理想的情况下,硬盘设备的读写性能会提升数倍,但是若任意一…

发表回复

您的电子邮箱地址不会被公开。

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