2010-03-09 55 views
58

我有存储在一个纯文本文件,此JSON对象:PHP的json_decode()返回NULL与有效的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()解码,它返回NULL。为什么? 该文件是可读的(我试图呼应file_get_contents(),它工作正常)。

我测试过JSON对http://jsonlint.com/,它是完全有效的。

这里有什么问题?

解决方案

寻找在谷歌的回答,我回到SO:json_decode returns NULL after webservice call。我的JSON文件具有UTF BOM序列(一些不应该存在的二进制字符),因此打破了JSON结构。去了十六进制编辑器,擦除了字节。一切都恢复正常。 这是为什么发生? 因为我使用Microsoft Windows'记事本编辑了文件。可怕的想法!

+2

使用PHP 5.2。9;因此,我不能使用'json_last_error()'。 –

+1

还要注意,这可能会发生在文件中间的其他无效字符。我只是让json_decode()返回null,因为这个字符串包含了一个特殊的连字符,可能是从MS Word粘贴的,然后可能是错误编码的。要识别潜在的问题字符,请打开JSON文件(我在Notepad ++中使用),更改编码(不转换),并保存为副本。然后比较两个文件(我使用WinMerge)。 – LinusR

+0

(Windows的记事本问题)请咨询这个,我也分享了这个问题,它修复了它:http://stackoverflow.com/questions/10290849/how-to-remove-multiple-utf-8-bom-sequences-before -doctype –

回答

45

它可能是特殊字符的编码。你可以询问json_last_error()以获得确定的信息。

更新:问题已解决,请查看问题中的“解决方案”段落。

+0

自从我开始应用程序以来,我一直在使用特殊字符,并且之前没有任何问题。在本地,JSON解码完美。在我的服务器上,它不。我不能调用'json_last_error()',因为它是PHP 5.2.9。该功能出现在PHP 5.3.0上。 –

+0

用HTML实体替换特殊字符。仍然是同样的结果。 –

+0

@Joel hang on,我会在5.3上测试它 –

19

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

您可以通过使用

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

然后你可以使用清除它:

json_decode($k)

print_r然后会显示阵列。

+0

你救了我的人生!,虽然很好英语;) –

+0

感谢你 - 希望你找到你失踪的英语。 –

+0

你救了我的命! –

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

为我做了。是的,在Chrome上进行测试。 Thx to user2254008

1

正如JürgenMath所述,使用由user2254008列出的preg_replace方法也为我解决了这个问题。

这不仅限于Chrome,它似乎是一个字符集转换问题(至少在我的情况下,Unicode - > UTF8)这解决了我所遇到的所有问题。

作为未来的节点,我解码的JSON对象来自Python的json.dumps函数。这反过来导致一些其他不卫生的数据通过,虽然它很容易处理。

-5
<?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>"; 
?> 
4

只是想我会补充一点,因为我今天遇到这个问题。如果JSON字符串周围有任何字符串填充,json_decode将返回NULL。

如果你拉从不是PHP变量其他来源的JSON,明智的做法是先“瘦身”吧:

$jsonData = trim($jsonData); 
11

我有同样的问题,我解决它只是通过更换解码前的引号字符。

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

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

+2

这帮我解决了我的问题! – Klaaz

40

这为我工作

json_decode(preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true); 
+0

为我工作。谢谢:) – webelizer

+2

我已经使用这个,并得到了数组,但我的语言特定字符(ş,ç,ö,..)也被删除了。 – zkanoca

+0

只有这个工作对我...谢谢 – 2015-05-08 13:05:15

1

如果从数据库中获取JSON,把

mysqli_set_charset($con, "utf8"); 

定义连接链路$ CON

+0

谢谢你TomoMiha。这正是我用MySQL包含特殊字符时遇到的所有问题,并且在被json_decode转换时,该特定字段被忽略= null .... – KLL

1

刚过节省一次。我花了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); 
6

你可以试试它。

json_decode(stripslashes($_POST['data'])) 
+0

没有其他工作与一个巨大的数组。谢谢! –

7

也许有些隐藏人物与您的JSON搞乱,试试这个:

$json = utf8_encode($yourString); 
$data = json_decode($json); 
0

我已经解决了这个问题,通过打印JSON,然后检查网页源(CTRL/CMD + U ):

print_r(file_get_contents($url)); 

原来有一个尾随<pre>标记。

1

这可以帮助您了解什么是错误的

<?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; 
} 
?> 
0

应确保这些点

1.您的JSON字符串类型不具有任何未知字符

2. json字符串可以从在线json查看器查看(您可以在谷歌上搜索在线查看器或解析器f或JSON)应该查看没有任何错误

您的字符串不具有HTML实体应该是纯文本/字符串

为点的解释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);