zoukankan      html  css  js  c++  java
  • json_decode的结果是null

    1、首先使用json_last_error确定问题

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

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

    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
    1
    2
    3
    4
    5
    6
    7
          我这边打印的结果是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
    1
    2
    3
          无效。

    (2)去掉boom头

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

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

    $jsonStr,chr= str_replace("'", '"', $jsonStr);
    1
          无效。

    (4)url_decode方式解码

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

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

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

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

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

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

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

  • 相关阅读:
    ubuntu18.04下eclipse修改maven源为阿里源
    Java中使用队列Queue
    Redis学习笔记——Redis的基本操作
    ubuntu安装redis
    Spring Boot使用监听器Listener
    Spring Boot中在程序中获得application.properties中的值
    Spring Boot使用过滤器Filter
    基于GTID的主从架构异常处理流程
    goroutine与调度器
    使用synergyc共享键鼠
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11097428.html
Copyright © 2011-2022 走看看