PHP:无法用多行编码 json [重复]

Posted

技术标签:

【中文标题】PHP:无法用多行编码 json [重复]【英文标题】:PHP: can't encode json with multiple rows [duplicate] 【发布时间】:2012-03-10 06:11:39 【问题描述】:

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

我正在从我的数据库中的表中检索数据,并且我想将其编码为 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."
    
 

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

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

任何建议都将不胜感激。

【问题讨论】:

我发现您的问题对于所需的输出过于含糊。是否应该有一个包含关联数组索引数组的data 元素?还是应该有索引数组——每个数组都有一个包含关联数据的元素 (data)?就个人而言,我认为 data 在结构中根本没有任何好处——它只是形成了不必要的数组深度。 【参考方案1】:

问题是您要为每一行输出单独的 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 对象,如与包含数组的单个数组相反。

【讨论】:

非常感谢!所有解决方案都有效,您的解决方案提供了最全面的解释。这不仅是正确的,而且我完全忽略了其他示例确实将 json_encode 函数放置在 while 循环之外。很抱歉没有注意到,感谢您的宝贵时间。【参考方案2】:

你需要把你的 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);

【讨论】:

【参考方案3】:

我认为你应该这样做

$rows = array();
while($r = mysql_fetch_assoc($result))
    $rows[]['data'] = $r;

echo json_encode($rows);

echo 应该放在循环之外。

【讨论】:

是的,但是每次脚本通过 while 循环时,这都会覆盖 $rows['data'],所以它不会工作 :) 谢谢,我没有注意到它只是复制并粘贴了他的代码,但现在已修复。【参考方案4】:

我在我的 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!
                        

                

【讨论】:

【参考方案5】:

我一定在这个问题上花了 15 个小时。上面讨论的每一个变化都被尝试过。最后我能够得到“标准解决方案”的工作。这个问题,很奇怪,似乎是这样的:

当间隔设置超过 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";

【讨论】:

以上是关于PHP:无法用多行编码 json [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP“漂亮打印”json_encode [重复]

JSON用PHP写出[重复]

尝试遍历 JSON 对象 [重复]

PHP PDO更新多行[重复]

PHP将带有一些(重复)元素的XML转换为Json到Json数组[重复]

PHP json_encode将行作为对象而不是数组返回[重复]