【问题标题】:PHP: can't encode json with multiple rows [duplicate]PHP:无法用多行编码 json [重复]
【发布时间】: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 在结构中根本没有任何好处——它只是形成了不必要的数组深度。

标签: php json


【解决方案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";
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-12
        • 1970-01-01
        • 2017-05-28
        • 2023-03-11
        • 2019-09-01
        • 2021-09-17
        • 2011-11-24
        • 2013-04-18
        相关资源
        最近更新 更多