3

这是一个有点难以解释的问题,所以我给你展示一下。如果您看下面,您将看到有效的 JSON。

{
    "data":{
        "0":{
            "action_id":"1",
            "date":"2012-04-10 15:07:38",
            "action_type":"1",
            "action_text":"Some one got blamed!"
        },
        "1":{
            "action_id":"2",
            "date":"2012-04-10 16:18:05",
            "action_type":"1",
            "action_text":"Testing multiple items for AJAX"
        },
        "total":2,
        "ajax_message":"Success",
        "ajax_status":"0",
        "success":"true"
    }
}

但是对于正在使用的应用程序,它无法处理“0”:“1”,它只是希望它用逗号分隔。

我当前生成此代码的代码是:

while ($r = mysql_fetch_assoc($q)) {
        $array[] = $r;
    }
json_encode($array);

目前相当简单和原始的东西。但我想我可能必须为自己编写一个 json_encode 才能像这样打印它.....

任何帮助将不胜感激

注意:这是一个有效的表格(手写):

{
"data": [
{
"action_id": "1",
"date": "2012-04-10 15:07:38",
"action_type": "1",
"action_text": "Some one got blamed!",
"fb_id": "760775384"
},
{
"action_id": "2",
"date": "2012-04-10 16:18:05",
"action_type": "1",
"action_text": "Testing multiple items for AJAX",
"fb_id": "760775384"
}
],
"total": 2,
"ajax_message": "Success",
"ajax_status": "0",
"success": "true"
}
4

3 回答 3

3

问题是您的数字键 ( 0, ) 在哈希中与命名键 ( ,等)1处于同一级别。而不是这样做:totalajax_message

$a = array();
while ($r = mysql_fetch_assoc($q)){
    $a[] = $r;
}
$a['key'] = value;

做这个:

$a = array();
$a['rows'] = array();
while ($r = mysql_fetch_assoc($q)){
    $a['rows'][] = $r;
}
$a['key'] = value;

如果数组中的每个键($a['rows']在本例中)都是数字,json_encode()则将其输出为[{list}, {like}, {this}]

于 2012-04-15T07:12:46.397 回答
1

你需要一个额外的数组级别。

你有:

array( 
  'data' => array(
    '0' => array()
    '1' => array()
    'total' => 2,
    'etc' => 'blah'
  )
)

但你要求这个:

array( 
  'data' => array(
    array(),
    array()
  )
  'total' => 2,
  'etc' => 'blah'
)

正如 Cal 所说,更深层次的问题是您将(隐式)数字键与您正在编码的数组的字符串键混合在一起。这在 PHP 中很好,但它对 JSON 中的数组无效,仅对对象有效。

json_encode将没有字符串键的数组编码为 JSON 数组,但它需要将字符串键数组编码为对象,以使它们成为有效的 JSON。

于 2012-04-15T07:08:45.870 回答
0
while ($r = mysql_fetch_assoc($q)) {
    $array[][] = $r;
}
json_encode($array);
于 2012-04-15T07:13:59.800 回答