仅使用 Javascript 将 PHP 对象转换为 JSON 对象
Converting PHP object to JSON object using only Javascript
我正在使用 Phonegap 制作移动应用程序并使用 Wordpress 作为后端。我正在使用带有 Google 映射 post 字段的高级自定义字段,其中 returns 一个 PHP 对象到使用 JSON API 的应用程序。我的 Wordpress 后端向应用程序发送一个普通的 JSON 对象,但在该对象内部是返回字符串化 PHP 对象的地方。
我需要在客户端(不在 Wordpress 中的应用程序)以某种方式将 PHP 对象转换为 JSON 对象。我看过其他答案说要为此使用 json_encode
,但我的问题是该应用程序只是 HTML/Javascript 而没有 PHP。有没有办法在 Javascript 函数中间使用 PHP 代码来做到这一点?或者更改后端会更好,以便它首先 returns 一个 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 返回的一小段,以澄清我在说什么。
"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 检索数据,那么为什么不以 JSON 格式将数据传送到您的应用程序?否则,您似乎首先消除了使用 API 的大部分意义……如果您真的愿意,您当然可以在 JavaScript 中解析该字符串,但这是一个非常丑陋且容易出错的过程解决方案。
JSON API 插件似乎使用 JSON:
I need to convert the PHP object to a JSON object somehow on the client side(the app which is not in Wordpress).
这里的这一点让我感到困惑。您在客户端没有 PHP 对象,PHP 是一项后端技术。返回给客户端的是一个字符串,可以是HTML、XML、JSON、任何其他编码形式的明文。
也就是说,假设您在 PHP 中有一个对象 $obj
,您可以将它传递给您的前端应用程序,创建一个端点 retrieve_object.php 并在那里:
echo json_encode($obj);
只要这是您唯一输出的内容,您的客户端应用程序就可以向 retrieve_object.php 发出请求(例如:AJAX)并获取 json 对象.
BUT ,这样做很重要(!),您可以序列化对象属性。您将丢失任何 PHP 对象方法。如果任何对象 属性 本身就是对象(例如:数据库连接),那么它也会丢失。
希望对您有所帮助!
我知道你有一个在前端工作的解决方案,但我仍然认为在服务器上解决这个问题会更好。
根据我们在评论中的对话,我仔细查看了 the code in the WordPress forum。问题似乎是 location
字段是一个字符串数组,而不仅仅是一个字符串。 maybe_unserialize
(和它使用的 is_serialized
)不处理数组。这是更新后的代码,您应该可以将其放入主题 functions.php
中。我做了一个快速测试,它对我有用。
class unserialize_php_arrays_before_sending_json {
function __construct() {
add_action( 'json_api_import_wp_post',
array( $this, 'json_api_import_wp_post' ),
10,
2 );
}
function json_api_import_wp_post( $JSON_API_Post, $wp_post ) {
foreach ( $JSON_API_Post->custom_fields as $key => $custom_field ) {
if (is_array($custom_field)) {
$unserialized_array = array();
foreach($custom_field as $field_key => $field_value) {
$unserialized_array[$field_key] = maybe_unserialize( $field_value );
}
$JSON_API_Post->custom_fields->$key = $unserialized_array;
}
else {
$JSON_API_Post->custom_fields->$key = maybe_unserialize( $custom_field );
}
}
}
}
new unserialize_php_arrays_before_sending_json();
我正在使用 Phonegap 制作移动应用程序并使用 Wordpress 作为后端。我正在使用带有 Google 映射 post 字段的高级自定义字段,其中 returns 一个 PHP 对象到使用 JSON API 的应用程序。我的 Wordpress 后端向应用程序发送一个普通的 JSON 对象,但在该对象内部是返回字符串化 PHP 对象的地方。
我需要在客户端(不在 Wordpress 中的应用程序)以某种方式将 PHP 对象转换为 JSON 对象。我看过其他答案说要为此使用 json_encode
,但我的问题是该应用程序只是 HTML/Javascript 而没有 PHP。有没有办法在 Javascript 函数中间使用 PHP 代码来做到这一点?或者更改后端会更好,以便它首先 returns 一个 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 返回的一小段,以澄清我在说什么。
"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 检索数据,那么为什么不以 JSON 格式将数据传送到您的应用程序?否则,您似乎首先消除了使用 API 的大部分意义……如果您真的愿意,您当然可以在 JavaScript 中解析该字符串,但这是一个非常丑陋且容易出错的过程解决方案。
JSON API 插件似乎使用 JSON:
I need to convert the PHP object to a JSON object somehow on the client side(the app which is not in Wordpress).
这里的这一点让我感到困惑。您在客户端没有 PHP 对象,PHP 是一项后端技术。返回给客户端的是一个字符串,可以是HTML、XML、JSON、任何其他编码形式的明文。
也就是说,假设您在 PHP 中有一个对象 $obj
,您可以将它传递给您的前端应用程序,创建一个端点 retrieve_object.php 并在那里:
echo json_encode($obj);
只要这是您唯一输出的内容,您的客户端应用程序就可以向 retrieve_object.php 发出请求(例如:AJAX)并获取 json 对象.
BUT ,这样做很重要(!),您可以序列化对象属性。您将丢失任何 PHP 对象方法。如果任何对象 属性 本身就是对象(例如:数据库连接),那么它也会丢失。
希望对您有所帮助!
我知道你有一个在前端工作的解决方案,但我仍然认为在服务器上解决这个问题会更好。
根据我们在评论中的对话,我仔细查看了 the code in the WordPress forum。问题似乎是 location
字段是一个字符串数组,而不仅仅是一个字符串。 maybe_unserialize
(和它使用的 is_serialized
)不处理数组。这是更新后的代码,您应该可以将其放入主题 functions.php
中。我做了一个快速测试,它对我有用。
class unserialize_php_arrays_before_sending_json {
function __construct() {
add_action( 'json_api_import_wp_post',
array( $this, 'json_api_import_wp_post' ),
10,
2 );
}
function json_api_import_wp_post( $JSON_API_Post, $wp_post ) {
foreach ( $JSON_API_Post->custom_fields as $key => $custom_field ) {
if (is_array($custom_field)) {
$unserialized_array = array();
foreach($custom_field as $field_key => $field_value) {
$unserialized_array[$field_key] = maybe_unserialize( $field_value );
}
$JSON_API_Post->custom_fields->$key = $unserialized_array;
}
else {
$JSON_API_Post->custom_fields->$key = maybe_unserialize( $custom_field );
}
}
}
}
new unserialize_php_arrays_before_sending_json();