【问题标题】:php json_encodephp json_encode
【发布时间】:2011-09-04 23:56:37
【问题描述】:

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

按照建议安装了 Services_JSON,但现在我得到一个空数组

Services_JSON 编码的 json 是这个:

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

但是当我调用 $json->decode() 我得到 Array ( )

【问题讨论】:

  • 你能显示代码吗? :)
  • 请使用此信息编辑您的问题。并使用 {}(代码格式化)按钮来格式化代码。检查预览的外观
  • 如果问题解决了,不要在标题中加上[SOLVED]。这不是论坛什么的。只需将最有用的答案标记为已接受,或者如果没有,请发布您自己的答案并在时间允许时将其标记为已接受。具有已接受答案的问题(即已回答的问题、已解决的问题)以深绿色背景显示在列表中,并且答案框中的计数为黄色。
  • 好的,我会在网站允许时添加答案。

标签: php utf-8 symfony1 json


【解决方案1】:

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

我得到了解决方案,这一切都归功于 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 进行同样的实验,我希望它对某人有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我现在在 ubuntu 服务器中使用 php 5.3.3
    • 我安装了 PEAR JSON,如何将它包含在我的项目中?
    • 我安装了它,但在尝试使用它时我得到 Class 'Services_JSON' not found
    • 您需要设置包含路径并需要文件:require_once 'Services/JSON.php';
    【解决方案3】:

    它可能是 UTF-8 BOM。尝试使用没有 BOM 编码的 UTF。同时回显json_last_error() 以查看问题所在。

    编辑:

    IS 是一个有效的 JSON

    【讨论】:

    • json_last_error 给我 4,等于 JSON_ERROR_SYNTAX :(
    【解决方案4】:

    来自php.net:如果无法解码 json 或编码数据深度超过递归限制,则返回 NULL
    因此,要么您将 e 递归限制设置为低于数据深度(如果您说它确实可以在另一个页面上工作,这似乎不是这种情况),或者无法解码 json。
    如果它在一个页面上有效而在另一个页面上无效,请检查文件编码。
    第一页可能被编码为 utf-8(您的 json 的编码),但第二页可能是其他内容(如 ascii)。 还要检查 bom。您可能需要在没有 bom 的情况下将页面编码为 utf-8。

    【讨论】:

    • 好的,见编辑。但它仍然可能是另一种 utf-8
    • 如何禁用 BOM,我使用 vim 作为我的 IDE
    • @Carlos: 我对 vim 不熟悉,但是 notepad++ 有这个功能,它适用于各种编码。如果您无法访问 notepad++,请检查是否有其他 ide你有这个选项,如果没有,我相信一个简单的谷歌搜索就可以了
    • @gion_13 我按照gala4th.blogspot.com/2011/01/… 此处的说明检查我的文件是否启用了 BOM,但标题中没有 BOM,所以现在我真的一无所知...跨度>
    • sry,我可能是错的,但尝试用 bom 设置它们然后:|。我没主意了。如果纯 php 失败,也许你应该使用一个类或包来处理你的 json:|
    【解决方案5】:

    如果您要处理的是模板,请查看:

    $sf_data->getRaw();
    

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

    【讨论】:

    • 谢谢,但我正在生成一个数组,然后将其编码为 json,然后将其保存在数据库中。我没有使用请求参数来生成它。
    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2012-11-09
    • 2011-05-03
    • 2017-06-17
    相关资源
    最近更新 更多