我在Windows机器上使用PHP 5.2.9-2和WAMP。
我在尝试解码其中一个元素中包含版权符号的JSON字符串时遇到问题。该函数始终返回NULL。我的第一个想法是试图逃避角色,但htmlentities()函数只返回相同的字符串。我试图像这样传递参数:
htmlentities($json, ENT_NOQUOTES, 'utf-8');
但是只返回一个空字符串。我考虑过尝试使用ENT_IGNORE,但它仅适用于PHP 5.3.0+。如果JSON对象中包含此版权符号,如何将此JSON字符串正确编码到其中?
我无法控制JSON的来源,是的,格式正确。我从第三方API获取信息,该字符串的文件大小略大于20MB。我使用ajax获取JSON然后将其保存到文件中,然后将其读入PHP。
编辑:以下是我正在使用的JSON的链接。
具体的一行是
...{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}...
EDIT2:
为了澄清,我希望将此JSON字符串转换为JSON对象,以便我可以使用foreach循环来提取每个部分并对其进行处理。如果我最后得到一个字符串,我就不会在哪里。我一直在使用像这样的解码函数来获取关联数组:
json_decode($json, true);
编辑3: 我已经整理了问题的准系统版本。我所做的就是从txt文件中读取JSON并尝试通过json_decode()函数运行它。使用版权符号,它失败了。没有它,它工作正常。这是:
***Contents of SOExampleJSON.txt***
{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}
***PHP Code***
<?php
echo '<pre>';
$rawJson = file_get_contents('SOExampleJSON.txt');
var_dump($rawJson);
$json = json_decode($rawJson);
var_dump($json);
echo '</pre>';
?>
***Output***
string(120) "{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}"
NULL
***Output when copyright is removed***
string(119) "{"Ranking":1115,"Name":"lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}"
object(stdClass)#1 (8) {
["Ranking"]=>
int(1115)
["Name"]=>
string(9) "lutchGod-"
["Rank"]=>
int(55)
["TotalExp"]=>
int(8571865)
["KDR"]=>
float(1.14)
["Kill"]=>
int(66459)
["HeadShot"]=>
int(11785)
["clan"]=>
string(4) " pG "
}
我需要上面的对象,但我需要保留“名称”,以便我可以在以后比较它。我不关心它是什么格式,只要它可用。据我所知,这是唯一带有这种符号的名称。该符号甚至不被允许作为名称的一部分,但开发人员显然已经在他们的检查中的某个地方搞砸了,现在我必须找到解决方法,直到他们修复它。我在2个月前报告了它,但仍然没有做任何事情,所以我不认为它会很快。
答案 0 :(得分:1)
yuck,PHP 5.2.X ...... 我认为这个黑客应该工作
<?php
$json=base64_decode('eyJSYW5raW5nIjoxMTE1LCJOYW1lIjoiwqlsdXRjaEdvZC0iLCJSYW5rIjo1NSwiVG90YWxFeHAiOjg1NzE4NjUsIktEUiI6MS4xNCwiS2lsbCI6NjY0NTksIkhlYWRTaG90IjoxMTc4NSwiY2xhbiI6IiBwRyAifQ==');
assert(strlen($json)>1);
$parsedJson=json_decode($json,true);
assert($parsedJson!=null);
?>
<script type="text/javascript">
var str=atob("<?php echo base64_encode(var_export($parsedJson,true));?>");
alert(str);
</script>
但是,当你升级到5.4.0或更高版本时,这将是一个更好的方法
<?php
$json=base64_decode('eyJSYW5raW5nIjoxMTE1LCJOYW1lIjoiwqlsdXRjaEdvZC0iLCJSYW5rIjo1NSwiVG90YWxFeHAiOjg1NzE4NjUsIktEUiI6MS4xNCwiS2lsbCI6NjY0NTksIkhlYWRTaG90IjoxMTc4NSwiY2xhbiI6IiBwRyAifQ==');
assert(strlen($json)>1);
$parsedJson=json_decode($json,true,1337);
assert($parsedJson!=null);
echo '<pre>';
ob_start();
var_dump($parsedJson);
echo htmlentities(ob_get_clean(),ENT_SUBSTITUTE);
echo '</pre>';
另外,你的问题可能不是json解码,它的html编码,ENT_IGNORE你需要PHP 5.3.0或更高版本,你需要PHP 5.4.0 for ENT_SUBSTITUTE,并且至少没有ENT_IGNORE:“如果输入string包含给定编码中的无效代码单元序列,除非设置了ENT_IGNORE或ENT_SUBSTITUTE标志,否则将返回空字符串。“ (http://php.net/manual/en/function.htmlentities.php)..我猜@计数。但使用断言只是为了确保这一点。也使用error_reporting(E_ALL); ,最好是exception_error_handler(见http://php.net/manual/en/class.errorexception.php)
答案 1 :(得分:0)
此代码适用于在Windows上使用PHP 5.6.6。保留©我在json_encode之前使用urlencode然后在使用json_decode之后使用urldecode将其恢复。
<?php
$test = urlencode('{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}');
$test2= json_encode($test);
var_dump(urldecode(json_decode($test2)));
编辑:更新以解决最新评论 这次是在Ubuntu上(PHP 5.5.9-1ubuntu4.6(cli)(内置:2015年2月13日19:17:11))
header('Content-Type: text/html; charset=utf-8');
$test = '{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}';
$test2 = json_decode($test);
print_r($test2);
输出:
stdClass Object
(
[Ranking] => 1115
[Name] => ©lutchGod-
[Rank] => 55
[TotalExp] => 8571865
[KDR] => 1.14
[Kill] => 66459
[HeadShot] => 11785
[clan] => pG
)