2017-04-26 56 views
0

如何在jQuery中反序列化数据?记住数据是由PHP序列化的。下面举例说明。jQuery反序列化PHP序列化的数据

a:2:{i:0;s:9:" img1.jpeg";i:1;s:9:"img2.jpeg";} 
+3

不要使用'序列化() ',使用'json_encode()'。 –

+0

@ AlexHowansky我将这个序列化的数据保存在数据库中。现在我想通过使用jQuery来反序列化数据。 –

+2

在php中反序列化它,然后json_encode它。 –

回答

1

这可以通过使用unserializejson_encode

$unserialized = unserialize($serialized_from_db); 
echo json_encode($unserialized); 

来实现,但是请注意,您的样本提供:s:9:" img1.jpeg"这部分是不正确。所述s:9意味着它期望字符串是9个字节(这link提供理解从serialize输出一个很好的指导),然而" img1.jpeg具有空间,因此为10个字节和失败:demo failing。您可以添加一个检查,看看这failes反序列化:

if ($unserialized === false) 

当修复不正确的部分:s:9:"img1.jpeg,给你:

a:2:{i:0;s:9:"img1.jpeg";i:1;s:9:"img2.jpeg";} 

将现在的工作,看到demo

在一天结束时,我会建议像其他人一样,在您的数据库中存储json_encode d值而不是serialize d值。

我想出了一个真正哈克的黑客可能解决不良序列化的数据:它

<?php 
function hackFixUnserialized($unserialized_string) { 
    $parts = explode(';', $unserialized_string); 
    foreach ($parts as &$part) { 
    $kv = explode(':', $part); 

    if ($kv[0] == 's') { 
     $str_without_quotes = str_replace('"', '', $kv[2]); 
     if ($kv[1] != strlen($str_without_quotes)) { 
     $kv[1] = strlen($str_without_quotes); 
     } 
    } 

    $part = implode(':', $kv); 
    } 

    return implode(';', $parts); 
} 

$unserialized_from_db = <<<EOT 
a:2:{i:0;s:9:" img1.jpeg";i:1;s:9:"img2.jpeg";} 
EOT; 

$unserialized = unserialize($unserialized_from_db); 
if ($unserialized === false) { 
    $hack_fix = hackFixUnserialized($unserialized_from_db); 
    printf('bad unserialized, fixed to: %s%s', $hack_fix, PHP_EOL); 
    $unserialized = unserialize($hack_fix); 

} 

echo json_encode($unserialized); 

演示在这里:https://eval.in/783408

希望这有助于

+0

我添加了一个黑客来尝试修复你的不好的序列化数据。 – alistaircol