【问题标题】:json_decode can't decode JSON stringjson_decode 无法解码 JSON 字符串
【发布时间】:2011-03-27 14:40:36
【问题描述】:

我有一个经过 gzip 压缩的 base64 JSON 字符串,转换此字符串后 json_decode() 无法对其进行解码。我认为这是一个编码问题,但一直无法解决。

我正在运行不支持 json_last_error() 的 PHP 5.2。

有人知道这里发生了什么吗?

<?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
?>

【问题讨论】:

  • 不会var_dump 自动echo

标签: php json


【解决方案1】:

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。

【讨论】:

  • C# .NET(我的压缩字符串来自哪里)字符串是我发现的 UTF-16。这似乎产生了垃圾: mb_convert_encoding($json, 'UTF-8', 'UTF-16')... 有什么想法吗?
  • @koen:如果您的输出编码实际上是 UTF-16,则需要将其转换回 UTF-16:mb_convert_encoding(json_decode(mb_convert_encoding($json, 'UTF-8', 'UTF-16'), true), 'UTF-16', 'UTF-8')
  • @koen:这些字符串实际上可能不是 UTF-16。至少它们缺少明确的 BOM,这就是 mb_ 混淆字节顺序的原因。最好谨慎行事并尝试mb_convert_encoding($json, 'UTF-8', 'UCS-2LE')
【解决方案2】:

在膨胀的字符串之间有大量无法识别的字符 - 所以它显示为 {?"?S?t? 等...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2023-04-08
    • 2012-07-06
    • 2012-10-16
    相关资源
    最近更新 更多