2011-05-30 84 views
2

我有一个symfony应用程序,它使用json_encodejson_decode来记录一些价格。 问题是json_decode工作正常在一个文件中(我可以解码存储在我的PSQL数据库中的字符串),但是当我从其他文件调用json_decode返回null时,我检查了文件编码(全部是utf-8)表和数据库编码(UTF-8也是如此)。所以我不知道问题出在哪里,也试过utf8_encode() ...php json_encode

任何帮助将不胜感激。 谢谢。

这里的有效编码的JSON(它是一个数组由PHP json_encode编码)

{"1":{"1":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}},"2":{"2":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}}} 

阵列:

$preciosOfertor = Array ([unidades] => Array ([1] => Array ([1] => Array ([fechaInicio] => 30-05-2011 [precios] => Array ([1] => Array ([precio] => 20000 [abreviatura] => CLP)) [fechaRetiro] => 31-05-2011)) [2] => Array ([2] => Array ([fechaInicio] => 30-05-2011 [precios] => Array ([1] => Array ([precio] => 20000 [abreviatura] => CLP)) [fechaRetiro] => 31-05-2011)))) 

为了编码它使用:

$preciosOfertor = json_encode($preciosOfertor); 

然后我打电话

$precios = json_decode($databaseObject->getPreciosOfertor(),true); 

当我在编码数组的文件中使用json_decode的时候,但是当我在项目的其他文件中使用它时,我只是用var_dump()获得了NULL。

的建议,但现在我得到一个空数组

该编码的JSON与Services_JSON安装Services_JSON是这个:

{"unidades":{"1":{"1":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}}}} 

但是,当我调用$ json->解码()我get Array()

+0

你可以显示代码吗? :) – fvox 2011-05-30 18:37:37

+0

请用这个信息编辑你的问题。并使用{}(代码格式)按钮来格式化代码。查看它的外观预览 – Nanne 2011-05-30 18:42:46

+1

如果问题解决了,请不要在标题中加入[[已解决]]。这不是论坛什么的。只需标记接受的最有用的答案,或者如果没有答案,则发布自己的答案,并在时间允许时将其标为接受。具有被接受的答案的问题(即回答问题,解决问题)出现在列表中,暗绿色背景和答案框中的黄色计数。 – BalusC 2011-05-30 21:06:59

回答

2

好的人,首先谢谢大家的帮助。

我得到了解决方案,这都得益于Zend Json库。

Symfony使用转义策略来防止XSS攻击,SQL注入攻击等等。所以当我调用json_encode和json_decode时,发生在这里发生了什么,它在Doctrine生成的对象中表示我的对象(在这种情况下,预留),因为它是对行数据(valoresOfertor)的本地调用,所以来自数据库的数据不会被转义,因此这些方法工作正常。

但后来,当我试图编码和保留类的外部解码行的值,Symfony的使用它的逃逸策略,让

" 

成为

&quot 

因此,尝试不同的JSON库,我使用了Zend之一,并且看到了显示的异常(语法错误:

at Zend_Json::decode('{"unidades":{"1":{"1":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}},"2":{"2":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}}}}') 
in SF_ROOT_DIR/apps/saas/modules/editreserva/templates/habitacionesSuccess.php line 20 ... 

所以然后我增加了以下行:

htmlspecialchars_decode($jsonVariable); 

它的工作。

我希望它可以帮助某人,如果他尝试与symfony和json相同。

+0

非常感谢!我遇到了同样的问题! – CamelBlues 2012-04-05 15:26:49

0

它可能是UTF-8 BOM。尝试使用没有BOM编码的UTF。还回显json_last_error()看看有什么问题。

编辑:

IS一个有效的JSON

+0

json_last_error给我4,即等于JSON_ERROR_SYNTAX :( – Carlos 2011-05-30 18:42:55

0

php.netNULL,如果JSON不能被解码或者如果编码的数据比递归限制更深返回
因此,无论您是否设置e递归限制低于数据深度(似乎并非如此,如果您认为它可以在另一个页面上工作),或者json无法解码。
如果它在一个页面上工作,而不在另一个页面上,请检查文件编码。
第一页可能被编码为utf-8(你的json的编码),但第二页可能是别的东西(如ascii)。 也检查bom。你可能需要将页面编码为utf-8而不用bom。

+0

正确阅读帖子,他说这两个地方都使用UTF-8 – SinistraD 2011-05-30 18:44:21

+0

ok,看看编辑,但它仍然可能是另一种utf-8 – 2011-05-30 18:55:27

+0

我怎么能禁用BOM,我使用Vim作为我的IDE – Carlos 2011-05-30 18:56:10

0

据我所知,以前版本的PHP中的json_encode()和json_encode()中存在一个或多个错误。您可以尝试将PHP更新到最新版本,或者您可以使用外部库对JSON进行编码和解码。有一些,但我认为PEAR JSON是最好的。

+0

我现在在ubuntu服务器上使用php 5.3.3 – Carlos 2011-05-30 18:47:47

+0

我安装了PEAR JSON,我如何将它包含在我的项目中? – Carlos 2011-05-30 18:58:50

+0

我安装了它,但试图使用它时,我得到 没有找到类'Services_JSON' – Carlos 2011-05-30 19:03:04

0

如果它是你正在处理它的模板,看看:

$sf_data->getRaw(); 

http://www.geeganage.com/symfony-json-made-easy/

+0

谢谢,但我是生成一个数组,然后将其编码为json,然后将其保存到数据库中。我没有使用请求参数来生成它。 – Carlos 2011-05-30 19:49:55