簡體   English   中英

如何將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,
);

任何幫助將不勝感激。 也可以在此處查看整個控制器。

您需要完成兩件事:

  1. all_tags值必須是順序數組,而不是關聯數組。 您可以通過在最后一條語句中使用array_values來實現:

     return array( 'all_tags' => array_values($input) ); 
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM