2016-11-02 102 views
0

我正在尝试为WordPress JSON API插件创建一个自定义控制器,至此一切正常,除了我所拥有的JSON数据格式不正确。如何将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

如何确定'count'和'id'值?它们似乎不符合当前JSON输出中的任何内容。它也似乎很奇怪,应该有重复的'id'值... – trincot

+0

@trincot我刚刚使用了插件的默认控制器输出之一来显示结构应该如何并忘记删除它们。 –

+0

好的,你删除了'count',那么'id'值呢?他们需要吗? – trincot

回答

1

有两件事情你需要实现:

  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删除重复项后总是返回一个顺序数组。

+1

不客气。我用'end'添加了一个可能触发错误的语句的替代方法。 ;-) – trincot

0

我觉得这里的问题是这样的:

 "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这样的索引。 。等等

让我知道,如果你需要更多的细节