2011-03-27 86 views
1

我有一個gzip的base64 JSON字符串,轉換後的字符串json_decode()無法解碼它。我認爲這是一個編碼問題,但一直無法解決它。json_decode無法解碼JSON字符串

我運行的PHP 5.2不支持json_last_error()。

有人知道這裏發生了什麼嗎?

<?php 
$gzipped_base64 = "7b0HYBxJliUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z28995777333nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8ifvGv8dGv8frXaH+N7NeY/hpvf40vf43LXyP/Nepf4/zXKH+N6te4ou8e0f9f0e/4tqHff8mv8f8A"; 

$json = gzinflate(base64_decode($gzipped_base64)); 

echo $json; // prints: {"StackOverflow":"Rocks"} 

$array = json_decode($json, true); 

echo var_dump($array); // prints: NULL 
?> 
+1

不自動''var_dump' echo'? – Groovetrain 2011-03-27 14:44:54

回答

9

json_decode預計投入爲UTF-8編碼,但你的數據似乎與UTF-16編碼:

var_export($json); 

輸出是:

'{' . "\0" . '"' . "\0" . 'S' . "\0" . 't' . "\0" . 'a' . "\0" . 'c' . "\0" . 'k' . "\0" . 'O' . "\0" . 'v' . "\0" . 'e' . "\0" . 'r' . "\0" . 'f' . "\0" . 'l' . "\0" . 'o' . "\0" . 'w' . "\0" . '"' . "\0" . ':' . "\0" . '"' . "\0" . 'R' . "\0" . 'o' . "\0" . 'c' . "\0" . 'k' . "\0" . 's' . "\0" . '"' . "\0" . '}' . "\0" . '' 

所以轉換在調用json_decode之前使用mb_convert_encodingiconv轉換爲UTF-8的字符編碼。

+0

C#.NET(我的壓縮字符串來自)字符串是我發現的UTF-16。這似乎產生垃圾:mb_convert_encoding($ json,'UTF-8','UTF-16')...任何想法? – koen 2011-03-27 15:00:52

+0

@koen:如果你的輸出編碼實際上是UTF-16,你需要將它轉換回UTF-16:mb_convert_encoding(json_decode(mb_convert_encoding($ json,'UTF-8','UTF-16'),true) ,'UTF-16','UTF-8')。 – Gumbo 2011-03-27 15:18:16

+1

@koen:這些字符串實際上可能不是UTF-16。至少他們缺乏一個明確的物料清單,這就是爲什麼mb_混淆了這種情況。更好地玩它安全,並嘗試'mb_convert_encoding($ json,'UTF-8','UCS-2LE')' – mario 2011-03-27 15:22:19

1

還有的胖串之間,無法識別的字符的負載 - 所以它讀取{?"?S?t?等等