PHP:不能用多行编码json

时间:2012-02-19 18:46:27

标签: php json

在发布问题之前,我花了几个小时查看了几个相似的答案。

我正在从数据库中的表中检索数据,我想将其编码为JSON。但是,json_encode()的输出仅在表有一行时才有效。如果有多行,则http://jsonlint.com/处的测试会返回错误。

这是我的疑问:

$result = mysql_query($query);

    $rows = array();

    //retrieve and print every record
    while($r = mysql_fetch_assoc($result)){
        $rows['data'] = $r;

        //echo result as json
        echo json_encode($rows);
    }

这让我得到以下JSON:

{
"data": 
    {
        "entry_id":"2",
        "entry_type":"Information Relevant to the Subject",
        "entry":"This is my second entry."
    }
}


{
"data":{
        "entry_id":"1",
        "entry_type":"My Opinion About What Happened",
        "entry":"This is my first entry."
    }
 }

当我在http://jsonlint.com/运行测试时,它会返回以下错误:

    Parse error on line 29:
    ..."No comment"    }}{    "data": {    
    ---------------------^
    Expecting 'EOF', '}', ',', ']'

但是,如果我只使用JSON的前半部分......

{
"data": 
    {
        "entry_id":"2",
        "entry_type":"Information Relevant to the Subject",
        "entry":"This is my second entry."
    }
}

......或者如果我只测试下半场...

{
    "data":{
        "entry_id":"1",
        "entry_type":"My Opinion About What Happened",
        "entry":"This is my first entry."
    }
 }

...相同的测试将返回“Valid JSON”。

我想要的是能够在表格的每一行输出一个[有效] JSON。

非常感谢任何建议。

5 个答案:

答案 0 :(得分:14)

问题是你为每一行吐出单独的JSON,而不是一次性完成。

$result = mysql_query($query);

$rows = array();

//retrieve and print every record
while($r = mysql_fetch_assoc($result)){
    // $rows[] = $r; has the same effect, without the superfluous data attribute
    $rows[] = array('data' => $r);
}

// now all the rows have been fetched, it can be encoded
echo json_encode($rows);

我所做的微小改动是将数据库的每一行存储为$rows数组中的新值。这意味着当它完成后,您的$rows数组会包含查询中所有行,因此您可以在完成后获得正确的结果。

您的解决方案的问题在于您为数据库的一行回显了有效的JSON,但是json_encode()并不知道所有其他行,因此您将获得一系列单独的JSON对象,而不是包含数组的单个。

答案 1 :(得分:3)

您需要将PHP代码更改为以下内容:

$result = mysql_query($query);

$rows = array();

//retrieve every record and put it into an array that we can later turn into JSON
while($r = mysql_fetch_assoc($result)){
    $rows[]['data'] = $r;
}
//echo result as json
echo json_encode($rows);

答案 2 :(得分:0)

我认为你应该这样做

$rows = array();
while($r = mysql_fetch_assoc($result)){
    $rows[]['data'] = $r;
}
echo json_encode($rows);

echo应该放在循环之外。

答案 3 :(得分:0)

我在PHP中尝试了同样的功能,所以我带来了这个......

$find = mysql_query("SELECT Id,nombre, appaterno, apmaterno, semestre, seccion, carrera FROM Alumno");

    //check that records exist
    if(mysql_num_rows($find)>0) {
        $response= array();
        $response["success"] = 1;

        while($line = mysql_fetch_assoc($find)){}
             $response[] = $line; //This worked for me
        }

        echo json_encode($response);

    } else {
        //Return error
        $response["success"] = 0;
        $response["error"] = 1;
        $response["error_msg"] = "Alumno could not be found";
        echo json_encode($response);
    }

而且,在我的Android类中......

if (Integer.parseInt(json.getString("success")) == 1) {

                    Iterator<String> iter = json.keys();
                    while (iter.hasNext()) {
                        String key = iter.next();
                        try {
                            Object value = json.get(key);
                            if (!value.equals(1)) {

                                JSONObject jsonArray = (JSONObject) value;

                                int id = jsonArray.getInt("Id");
                                if (!db.ExisteAlumo(id)) {
                                    Log.e("DB EXISTE:","INN");
                                    Alumno a = new Alumno();

                                    int carrera=0;
                                    a.setId_alumno(id);
                                    a.setNombre(jsonArray.getString("nombre"));
                                    a.setAp_paterno(jsonArray.getString("appaterno"));
                                    a.setAp_materno(jsonArray.getString("apmaterno"));
                                    a.setSemestre(Integer.valueOf(jsonArray.getString("semestre")));
                                    a.setSeccion(jsonArray.getString("seccion"));
                                    if(jsonArray.getString("carrera").equals("C"))
                                        carrera=1;
                                    if(jsonArray.getString("carrera").equals("E"))
                                        carrera=2;
                                    if(jsonArray.getString("carrera").equals("M"))
                                        carrera=3;
                                    if(jsonArray.getString("carrera").equals("S"))
                                        carrera=4;
                                    a.setCarrera(carrera);

                                    db.addAlumno(a);

                                }

                            }
                        } catch (JSONException e) {
                            // Something went wrong!
                        }

                }

答案 4 :(得分:0)

我必须花15个小时来解决这个问题。尝试了上面讨论的每个变体。最后,我得到了标准解决方案&#39;工作。奇怪的是,这个问题似乎是这样的:

当间隔设置超过14小时时,json似乎无法解析它。 JSON必须有限制。

$sql= "SELECT cpu_name, used, timestamp FROM tbl_cpu_use WHERE timestamp>(NOW() - INTERVAL 14 HOUR) ORDER BY id";
$result=mysql_query($sql);
if ($result){
    $i=0;
    $return =[];
    while($row = mysql_fetch_array($result, MYSQL_NUM)){
        $rows[] = $row;
    }
    echo json_encode($rows);
}else{
    echo "ERROR";
}