如何将 JSON 输出格式化为所需格式
How to format the JSON output to the desired format
我正在尝试为 WordPress JSON API 插件创建一个自定义控制器,到目前为止一切正常,除了我拥有的 JSON 数据格式不正确。
这是我当前的 JSON 输出:
{
"status": "ok",
"all_tags": {
"tag-1": {
"term_name": "Tag 1",
"category_details": {
"0": {
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
},
"2": {
"category_ID": 13,
"category_name": "category 2",
"category_count": 1
}
}
},
"tag-2": {
"term_name": "Tag 2",
"category_details": [
{
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
}
]
}
}
}
但是,为了解析数据,我 必须 特定格式的 json 数据。正确的格式应该是这样的:
{
"status": "ok",
"all_tags": [
{
"id": 1,
"term_name": "Tag 1",
"category_details": [
{
"id": 2,
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
},
{
"id": 3,
"category_ID": 13,
"category_name": "category 2",
"category_count": 1
}
]
},
{
"id": 2,
"term_name": "Tag 2",
"category_details": [
{
"id": 2,
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
}
]
}
]
}
这就是我为 json 创建数组的方式:
<?php
...
$cats_all = array(); // the array
if (!isset($cats_all[$custom_term->slug])) {
// create the array
$cats_all[$custom_term->slug] = array(
'term_name' => $custom_term->name,
'category_details' => array(
array(
'category_ID' => $categories[0]->term_id,
'category_name' => $categories[0]->name,
'category_count' => $mycats[0]->category_count
)
)
);
} else {
$cats_all[$custom_term->slug]['category_details'][] = array(
'category_ID' => $categories[0]->term_id,
'category_name' => $categories[0]->name,
'category_count' => $mycats[0]->category_count
);
}
...
// remove duplicates
$input = $this->super_unique( $cats_all );
// return the array for json output by the plugin
return array(
'all_tags' => $input,
);
任何帮助将不胜感激。整个控制器也可以是 viewed here.
我认为这里的问题是:
"0": {
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
},
"2": {
"category_ID": 13,
"category_name": "category 2",
"category_count": 1
}
如果您希望数组成为 json 编码数组,索引必须是数字和相关项 (0,1,2,3...)
可能,在使用你的 $this->super_unique( $cats_all ) 之后,或者在这个函数内部,你应该在每个重新索引的数组上调用 array_values ;它将数组的值重置为 0、1、... 等等...并且在编码时,它将是一个数组而不是一个对象。
一般来说,在使用 array_filter(...) 正确重新索引数组后使用 $array = array_values($array) 是一个好习惯,在其他地方,你可以得到索引如 0,2,7...等...
如果您需要更多详细信息,请告诉我
您需要完成两件事:
all_tags
值必须是顺序数组,而不是关联数组。这可以通过在最后一个语句中使用 array_values
来实现:
return array(
'all_tags' => array_values($input)
);
category_details
值必须是顺序数组,而不是关联数组。这个比较棘手,因为你实际上 do 将它们创建为顺序数组,但函数 super_unique
有时会将它们转换为关联数组数组,当它消除至少一个重复项时。我建议通过添加两个语句来修复函数 super_unique
,围绕这个:
$result = array_map( 'unserialize', array_unique( array_map( 'serialize', $array ) ) );
得到这个:
$is_seq = end(array_keys($array)) == count($array)-1;
$result = array_map( 'unserialize', array_unique( array_map( 'serialize', $array ) ) );
if ($is_seq) $result = array_values($result);
如果您在 end
上遇到错误,那么您可以将其用于该行:
end($array); $is_seq = key($array) == count($array)-1;
$is_seq
变量检查 $array
是否是连续的,如果是,则在删除重复项后调用 array_values
,它始终是 returns 连续数组。
我正在尝试为 WordPress JSON API 插件创建一个自定义控制器,到目前为止一切正常,除了我拥有的 JSON 数据格式不正确。
这是我当前的 JSON 输出:
{
"status": "ok",
"all_tags": {
"tag-1": {
"term_name": "Tag 1",
"category_details": {
"0": {
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
},
"2": {
"category_ID": 13,
"category_name": "category 2",
"category_count": 1
}
}
},
"tag-2": {
"term_name": "Tag 2",
"category_details": [
{
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
}
]
}
}
}
但是,为了解析数据,我 必须 特定格式的 json 数据。正确的格式应该是这样的:
{
"status": "ok",
"all_tags": [
{
"id": 1,
"term_name": "Tag 1",
"category_details": [
{
"id": 2,
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
},
{
"id": 3,
"category_ID": 13,
"category_name": "category 2",
"category_count": 1
}
]
},
{
"id": 2,
"term_name": "Tag 2",
"category_details": [
{
"id": 2,
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
}
]
}
]
}
这就是我为 json 创建数组的方式:
<?php
...
$cats_all = array(); // the array
if (!isset($cats_all[$custom_term->slug])) {
// create the array
$cats_all[$custom_term->slug] = array(
'term_name' => $custom_term->name,
'category_details' => array(
array(
'category_ID' => $categories[0]->term_id,
'category_name' => $categories[0]->name,
'category_count' => $mycats[0]->category_count
)
)
);
} else {
$cats_all[$custom_term->slug]['category_details'][] = array(
'category_ID' => $categories[0]->term_id,
'category_name' => $categories[0]->name,
'category_count' => $mycats[0]->category_count
);
}
...
// remove duplicates
$input = $this->super_unique( $cats_all );
// return the array for json output by the plugin
return array(
'all_tags' => $input,
);
任何帮助将不胜感激。整个控制器也可以是 viewed here.
我认为这里的问题是:
"0": {
"category_ID": 8,
"category_name": "category 1",
"category_count": 2
},
"2": {
"category_ID": 13,
"category_name": "category 2",
"category_count": 1
}
如果您希望数组成为 json 编码数组,索引必须是数字和相关项 (0,1,2,3...)
可能,在使用你的 $this->super_unique( $cats_all ) 之后,或者在这个函数内部,你应该在每个重新索引的数组上调用 array_values ;它将数组的值重置为 0、1、... 等等...并且在编码时,它将是一个数组而不是一个对象。
一般来说,在使用 array_filter(...) 正确重新索引数组后使用 $array = array_values($array) 是一个好习惯,在其他地方,你可以得到索引如 0,2,7...等...
如果您需要更多详细信息,请告诉我
您需要完成两件事:
all_tags
值必须是顺序数组,而不是关联数组。这可以通过在最后一个语句中使用array_values
来实现:return array( 'all_tags' => array_values($input) );
category_details
值必须是顺序数组,而不是关联数组。这个比较棘手,因为你实际上 do 将它们创建为顺序数组,但函数super_unique
有时会将它们转换为关联数组数组,当它消除至少一个重复项时。我建议通过添加两个语句来修复函数super_unique
,围绕这个:$result = array_map( 'unserialize', array_unique( array_map( 'serialize', $array ) ) );
得到这个:
$is_seq = end(array_keys($array)) == count($array)-1; $result = array_map( 'unserialize', array_unique( array_map( 'serialize', $array ) ) ); if ($is_seq) $result = array_values($result);
如果您在
end
上遇到错误,那么您可以将其用于该行:end($array); $is_seq = key($array) == count($array)-1;
$is_seq
变量检查$array
是否是连续的,如果是,则在删除重复项后调用array_values
,它始终是 returns 连续数组。