JSON与数据库中的序列化数组[关闭]


Answers:


93
  1. JSON编码()和解码()
    • PHP版本> = 5.0.0
      • 嵌套上限为20。
    • PHP版本> = 5.2.3
      • 嵌套上限为128。
    • PHP版本> = 5.3.0
      • 嵌套上限为512。
    • 与PHP的序列化字符串相比,占用空间小。
  2. 序列化()和反序列化()
    • PHP版本> = 4.0.0
      • 方法不会在PHP数据类型对象上丢失。
      • __wakeup()魔术方法在任何要反序列化的对象上调用。(很强大)
      • 已经注意到,有时最好使用此功能将base64编码字符串放入数据库中,并最好将base64解码字符串从数据库中取出,因为某些空白字符的处理存在一些问题。

这是你的选择。


15
为__wakeup()投票。
altermativ

我存储的是Twitter返回的JSON,因此我需要base64_encode来避开时髦字符的转义。
埃里克·科普

非常重要的一点serialize-它保留了正确的序列化对象类型wordpress.stackexchange.com/a/61094/91844
Arnis Juraga,

86

专业JSON:

  • JSON数据可以被许多不同的语言使用,而不仅仅是PHP
  • JSON数据是人类可读和可写的。
  • 占用空间少
  • 编码JSON比序列化更快

专业序列化阵列:

  • 反序列化比JSON解码更快

如注释所示,JSON比序列化数组占用更少的空间。我还检查了JSON或序列化是否更快,并且令人惊讶的是,JSON编码比序列化更快。不过,反序列化比JSON解码更快。

这是我用来测试的脚本:

<?php 
function runTime(){
      $mtime = microtime(); 
      $mtime = explode(' ', $mtime); 
      $mtime = $mtime[1] + $mtime[0]; 
      return $mtime; 
}
?> 
<pre>
<?php
$start = runTime();

$ser;

for($i=0; $i<1000; $i++){
    $a = array(a => 1, x => 10);
    $ser = serialize($a);
}
$total = runTime() - $start;
echo "Serializing 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$json;

for($i=0; $i<1000; $i++){
    $a = array(a => 1, x => 10);
    $json = json_encode($a);
}
$total = runTime() - $start;
echo "JSON encoding 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$ser;

for($i=0; $i<1000; $i++){
    $a = unserialize($ser);
}
$total = runTime() - $start;
echo "Unserializing 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$json;

for($i=0; $i<1000; $i++){
    $a = json_decode($json);
}
$total = runTime() - $start;
echo "JSON decoding 1000 times took \t$total seconds";
?>
</pre>

+6错误答案?JSON:{“ x”:1,“ b”:“ e”} Serliaze:a:2:{s:1:“ x”; i:1; s:1:“ b”; s:1:“ e “;}因此JSON占用的空间更少...
思想家

谢谢思想家,我认为PHP序列化器将其序列化为某种字节码,绝对不是字符串。我现在很失望。
Marius

3
PHP序列化格式包含元素的长度(字符串和数组),因此这就是为什么它比json写入速度慢(json不会存储),但是读取速度却更快(当您知道读取文件时的期望时,则更少)要实现的条件逻辑,例如,导入一个2000个字符的字符串,就足以读取接下来的2000个字符,而无需每次都检查当前字符是否指示字符串的结尾,就像对json_decode所做的那样,就足以读取该字符)
Elvis Ciotti

注意: MySQL 5.7.8+包括对JSON的本地支持
dreftymac

29

可移植性:JSON优胜者。JSON在更广泛的平台上受支持,而据我所知,PHP仅支持反序列化。尽管可以用任何一种语言解析任何一种格式,但JSON都有更多的预构建库。

未来证明:JSON优胜者。JSON是一种“标准”,就Javascript是一种标准而言,将来不太可能会更改。PHP小组没有对序列化格式的未来做任何保证,尽管将来不太可能更改,但是由一个小组控制该格式的事实意味着您最终可能会得到将来无法读取的数据。

保真度:PHP优胜者。通过PHP序列化,您可以使用本地PHP数据类型存储数据,包括由自定义类定义的对象。JSON仅允许您存储通用原始类型,原始类型列表(“数组”)和键/值对对象。如果您正在开发PHP应用程序,则PHP序列化可能会在此处提供一些优势。

文件大小:JSON在这里略胜一筹,因为PHP当前的序列化格式更加冗长(因为它存储了更多信息)。

绩效:谁知道,这取决于个人资料。

结论:除非有充分的理由要使用PHP序列化,否则请使用JSON。


7

JSON具有更强的可移植性,即,您可以更轻松地从其他语言等中读取/写入JSON。如果您使用PHP序列化的数组,则只能轻松地使用PHP对其进行访问。


不同意,当用作微服务时,这将不是问题
Yoosuf Mohamed

@Yoosuf您不同意什么?我从未说过这是一个问题。
汤姆·海格

7

您是否仅在PHP中使用数据?如果是:数组,如果不是:JSON。

专业阵列

  • 会话使用序列化:我认为它比json_encode / decode更快(不太确定)
  • PHP数组上的许多功能(排序/合并/ ...)

专业JSON

  • JSON在其他语言和网络语言中也是众所周知的
  • 数据库中的详细程度较低
  • 许多工具,例如XML:JSON SChema

4

关于SO的问题很多。

存储PHP数组的首选方法(json_encode与序列化)

简而言之:JSON更适合简单数据,但不能区分对象和关联数组之间的区别。序列化的数据更大。


JSON确实区分对象和数组,{“ member1”:“ value”,“ member2”:[“ member1”,“ member2”]}
LM。

3
LithMaster,您应该学习什么是关联数组。它不是您的示例中的数组。
思想家

3

使用json用于数组以及与Javascript或其他语言的通信。为当前正在运行的脚本使用对象的序列化或任何内部PHP工作。


2

如果您尝试绕开JSON.stringify(obj)中的引号和特殊字符,则可以在PHP中使用其特定于数据库的转义方法来实现。

<?php
mysql_real_escape_string(htmlspecialchars($value))
?>

您现在可以安全地存储它,并在读回时对其进行解码


2

正如大多数答案所指出的那样,JSON胜过了序列化。我认为最大的优势是平台独立性。您可能有其他应用程序与您的数据库通信,并且它们可能与php没有任何关系。

但是这两种解决方案都违反了数据库规范化。您的数据库甚至都不会采用第一标准格式,因此您无法利用任何数据库功能,例如搜索。更好的方法是使用对象关系映射。那里有很好的库-例如考虑ORM


1

我只是用php serialize这个大问题。我在一个使用反序列化的字段中存储了很多数据读取的。

发生的事情是我在该字段中收到一些损坏的数据。序列化使用“ a”,“ s”和“ N”之类的代码映射数据。如果有损坏的数据,则映射失败。它将显示php错误,因为字节码错误,反序列化功能无法工作。

所以我的意思是避免序列化。使用JSON可以更安全,您不会对未来的专业问题大惊小怪。

对我来说,不再需要序列化了


-5

atm,json_encode()仅适用于UTF-8编码的数据。.因此,它无法编码诸如“ñ”的字符,否则返回NULL


3
UTF-8编码的数据可以轻松表示ñ。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.