代码之家  ›  专栏  ›  技术社区  ›  Joel A. Villarreal Bertoldi

php json_decode()使用有效的json返回null?

  •  79
  • Joel A. Villarreal Bertoldi  · 技术社区  · 14 年前

    我将这个json对象存储在纯文本文件中:

    {
        "MySQL": {
            "Server": "(server)",
            "Username": "(user)",
            "Password": "(pwd)",
            "DatabaseName": "(dbname)"
        },
        "Ftp": {
            "Server": "(server)",
            "Username": "(user)",
            "Password": "(pwd)",
            "RootFolder": "(rf)"
        },
        "BasePath": "../../bin/",
        "NotesAppPath": "notas",
        "SearchAppPath": "buscar",
        "BaseUrl": "http:\/\/montemaiztusitio.com.ar",
        "InitialExtensions": [
            "nem.mysqlhandler",
            "nem.string",
            "nem.colour",
            "nem.filesystem",
            "nem.rss",
            "nem.date",
            "nem.template",
            "nem.media",
            "nem.measuring",
            "nem.weather",
            "nem.currency"
        ],
        "MediaPath": "media",
        "MediaGalleriesTable": "journal_media_galleries",
        "MediaTable": "journal_media",
        "Journal": {
            "AllowedAdFileFormats": [
                "flv:1",
                "jpg:2",
                "gif:3",
                "png:4",
                "swf:5"
            ],
            "AdColumnId": "3",
            "RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/",
            "FrontendLayout": "Flat",
            "AdPath": "ad",
            "SiteTitle": "Monte Maíz: Tu Sitio",
            "GlobalSiteDescription": "Periódico local de Monte Maíz.",
            "MoreInfoAt": "Más información aquí, en el Periódico local de Monte Maíz.",
            "TemplatePath": "templates",
            "WeatherSource": "accuweather:SAM|AR|AR005|MONTE MAIZ",
            "WeatherMeasureType": "1",
            "CurrencySource": "cotizacion-monedas:Dolar|Euro|Real",
            "TimesSingular": "vez",
            "TimesPlural": "veces"
        }
    }
    

    当我试图用 json_decode() ,返回空值。为什么? 文件是可读的(我试着回音 file_get_contents() 而且效果很好)。

    我对json进行了测试 http://jsonlint.com/ 这是完全正确的。

    这里怎么了?

    解决方案

    在谷歌上寻找答案,我又回到了: json_decode returns NULL after webservice call . 我的json文件有utf-bom序列(一些不应该存在的二进制字符),因此破坏了json结构。转到十六进制编辑器,删除字节。一切都恢复正常了。 为什么会这样? 因为我用微软windows的记事本编辑了这个文件。 糟糕的主意!

    16 回复  |  直到 7 年前
        1
  •  55
  •   Pekka    14 年前

    可能是特殊字符的编码。你可以问 json_last_error() 得到确切的信息。

    更新:问题解决了,看看问题中的“解决方案”一段。

        2
  •  56
  •   Dunith Dhanushka    10 年前

    这对我有效

    json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true );
    
        3
  •  22
  •   Jack T.Todua    8 年前

    如果在chrome中检查请求,您将看到json是文本,因此json中添加了空白代码。

    你可以用

    $k=preg_replace('/\s+/', '',$k);

    然后您可以使用:

    json_decode($k)

    print_r 然后将显示数组。

        4
  •  15
  •   Gabriel Castillo Prada    9 年前

    你可以试试。

    json_decode(stripslashes($_POST['data']))
    
        5
  •  12
  •   Yapp Ka Howe    11 年前

    我有同样的问题,我解决了它,只需在解码前替换引号字符。

    $json = str_replace('"', '"', $json);
    $object = json_decode($json);
    

    我的json值是由json.stringify函数生成的。

        6
  •  9
  •   Albert Abdonor    8 年前

    可能有些隐藏字符正在干扰您的json,请尝试以下操作:

    $json = utf8_encode($yourString);
    $data = json_decode($json);
    
        7
  •  6
  •   zkanoca Manisha    10 年前
    $k=preg_replace('/\s+/', '',$k); 
    

    为我做的。是的,在Chrome上测试。THX至用户225408

        8
  •  4
  •   Phil LaNasa    11 年前

    我今天碰到这个问题的时候,我想我应该补充一下。如果json字符串周围有任何字符串填充,json_decode将返回null。

    如果要从php变量以外的源中提取json,最好先“修剪”它:

    $jsonData = trim($jsonData);
    
        9
  •  2
  •   Enrico Tempesti    7 年前

    这有助于您了解错误的类型

    <?php
    // A valid json string
    $json[] = '{"Organization": "PHP Documentation Team"}';
    
    // An invalid json string which will cause an syntax 
    // error, in this case we used ' instead of " for quotation
    $json[] = "{'Organization': 'PHP Documentation Team'}";
    
    
    foreach ($json as $string) {
        echo 'Decoding: ' . $string;
        json_decode($string);
    
        switch (json_last_error()) {
            case JSON_ERROR_NONE:
                echo ' - No errors';
            break;
            case JSON_ERROR_DEPTH:
                echo ' - Maximum stack depth exceeded';
            break;
            case JSON_ERROR_STATE_MISMATCH:
                echo ' - Underflow or the modes mismatch';
            break;
            case JSON_ERROR_CTRL_CHAR:
                echo ' - Unexpected control character found';
            break;
            case JSON_ERROR_SYNTAX:
                echo ' - Syntax error, malformed JSON';
            break;
            case JSON_ERROR_UTF8:
                echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
            break;
            default:
                echo ' - Unknown error';
            break;
        }
    
        echo PHP_EOL;
    }
    ?>
    
        10
  •  1
  •   Destreyf    11 年前

    正如j_四分之一rgen math所说,使用用户225408列出的preg_replace方法也为我修复了它。

    这并不局限于chrome,它似乎是一个字符集转换问题(至少在我的例子中是unicode->utf8),这解决了我遇到的所有问题。

    作为未来的节点,我正在解码的json对象来自python的json.dumps函数。这反过来又导致了一些其他不卫生的数据,尽管它很容易处理。

        11
  •  1
  •   TomoMiha    10 年前

    如果要从数据库获取json,请将

    mysqli_set_charset($con, "utf8");
    

    定义连接链接$con之后

        12
  •  1
  •   Samuel Kwame Antwi    9 年前

    省点时间就行了。我花了3个小时才发现这只是HTML编码问题。试试这个

    if(get_magic_quotes_gpc()){
       $param = stripslashes($row['your column name']);
    }else{
      $param = $row['your column name'];
    }
    
    $param = json_decode(html_entity_decode($param),true);
    $json_errors = array(
    JSON_ERROR_NONE => 'No error has occurred',
    JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
    JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
    JSON_ERROR_SYNTAX => 'Syntax error',
    );
    echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
    print_r($param);
    
        13
  •  1
  •   Community M-A    7 年前

    在这里,您可以找到小的json包装器,其中包含解决bom和非asci问题的纠正措施: https://stackoverflow.com/a/43694325/2254935

        14
  •  0
  •   Jeffrey Roosendaal SReddy    8 年前

    我通过打印json并检查页面源(ctrl/cmd+u)解决了这个问题:

    print_r(file_get_contents($url));
    

    结果发现有一个拖尾 <pre> 标签。

        15
  •  0
  •   Hassan Saeed    7 年前

    你应该确保这些点

    1。 您的json字符串没有任何未知字符

    2。 json字符串可以从在线json查看器查看(您可以作为在线查看器或json解析器在google上搜索),它应该可以查看而不会出现任何错误

    三。 你的字符串没有HTML实体应该是纯文本/string

    关于第3点的解释

    $html_product_sizes_json=htmlentities($html);
        $ProductSizesArr = json_decode($html_product_sizes_json,true);
    

    (删除htmlEntities()函数)

    $html_product_sizes_json=$html;
        $ProductSizesArr = json_decode($html_product_sizes_json,true);
    
        16
  •  -5
  •   Tushar Gupta - curioustushar    11 年前
    <?php 
    $json_url = "http://api.testmagazine.com/test.php?type=menu";
    $json = file_get_contents($json_url);
    $json=str_replace('},
    
    ]',"}
    
    ]",$json);
    $data = json_decode($json);
    
    echo "<pre>";
    print_r($data);
    echo "</pre>";
    ?>