[英]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,
);
任何幫助將不勝感激。 也可以在此處查看整個控制器。
您需要完成兩件事:
all_tags
值必須是順序數組,而不是關聯數組。 您可以通過在最后一條語句中使用array_values
來實現:
return array( 'all_tags' => array_values($input) );
category_details
值必須是順序數組,而不是關聯數組。 這一點比較棘手,因為您實際上確實將它們創建為順序數組,但是當函數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
,該重復項始終返回順序的數組。
我認為這里的問題是這樣的:
"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等的索引。 。
讓我知道您是否需要更多詳細信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.