如何将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…等等…

如果你需要更多的细节请告诉我