【发布时间】:2016-03-06 22:51:21
【问题描述】:
我正在使用 Phonegap 制作一个移动应用程序,并使用 Wordpress 作为后端。我正在使用带有 Google Maps 帖子字段的高级自定义字段,该字段使用 JSON API 将 PHP 对象返回给应用程序。我的 Wordpress 后端向应用程序发送一个普通的 JSON 对象,但在该对象内部是一个字符串化的 PHP 对象被返回的地方。
我需要在客户端(不在 Wordpress 中的应用程序)以某种方式将 PHP 对象转换为 JSON 对象。我已经查看了其他说要为此使用json_encode 的答案,但我的问题是该应用程序只是 HTML/Javascript 而没有 PHP。有没有办法在 Javascript 函数中间使用 PHP 代码来做到这一点?还是最好更改后端以便它首先返回 JSON 对象而不是 PHP 对象?如果是这样,我该怎么做?
我在 PHP 方面的经验仍然有限,因此不胜感激。
编辑:为了澄清一点,我在与我的 Phonegap 应用程序不同的域上使用 Wordpress,并且仅在 Wordpress 端使用 JSON API 插件。然后我使用 jQuery Ajax 调用从 Wordpress 后端检索数据。
返回的 PHP 对象也如下所示:a:3:{s:7:\"address\";s:48:\"8915 W 159th St, Orland Hills, IL, United States\";s:3:\"lat\";s:17:\"41.60111599999999\";s:3:\"lng\";s:11:\"-87.8364575\";}
我刚刚想到的另一种方法是,是否可以将其保留为 PHP 对象并仍然以某种方式从中读取值?我不需要它是一个 JSON 数组,我只需要一种方法以一种或另一种方式读取数组中的各个元素。
这也是返回的 JSON 的一个小 sn-p,以澄清我在说什么。
"custom_fields": {
"location": [
"a:3:{s:7:\"address\";s:48:\"8915 W 159th St, Orland Hills, IL, United States\";s:3:\"lat\";s:17:\"41.60111599999999\";s:3:\"lng\";s:11:\"-87.8364575\";}"
]
}
这当然不是整个 JSON 对象,但它让您了解我正在处理的内容。
【问题讨论】:
-
我已经做过很多次了,但遗憾的是没有使用 JSON API 插件,所以在您的特殊情况下我无能为力。但是,从您显示的 PHP 内容来看,它必须是 unserialized,然后才能将其传递给您的插件。您显示的是字符串,而不是 PHP 对象。
-
@Hobo 是的,抱歉,我将编辑帖子以澄清这一点,它是一个经过标记的 PHP 对象。基本上发生的事情是 JSON API 插件返回一个包含所有帖子的常规 JSON 对象,但在包含有关地图信息的属性中的该对象内部由于某种原因以 PHP 形式返回。
-
好的,明白了。所以 ACF 没有反序列化数据的设置?我仍然认为在服务器上反序列化比尝试在客户端上进行反序列化要好得多。 ACF 是否在该字段上有一个可以挂钩的过滤器?如果没有,您是否可以在拥有对象后取消序列化该字段(例如
$obj->map_data = unserialize($obj->map_data)?抱歉,如果语法关闭,我已经有一段时间没有用 PHP 编码了 -
@Hobo 我不相信 ACF 具有返回普通 JSON 对象的内置方法,因为我认为它不是为此而设计的。我必须添加一些我在网上找到的额外 PHP 代码来获取 JSON API 来返回 ACF 字段。我现在将尝试四处寻找,看看是否可以找到该属性的返回位置,并尝试按照您所说的去做。
-
好吧,这更有意义。这是一个 json 数组中的 PHP 对象,请参阅stackoverflow.com/a/29519646/1876047 问题是它已被转义。因此,您首先要从位置列表中提取对象,这可以通过解码 json 结构来完成。之后你想去掉斜线,我相信 PHP 有一个 strip_slashes 方法?完成后,您应该能够使用 unserialize() 方法并恢复 PHP 对象。然后,要将其传递给您的客户端应用程序,只需使用 json_encode 将其重新编码为 JSON。希望这是有道理的:)
标签: javascript php json wordpress advanced-custom-fields