2012-02-19 79 views
6

在发布我的问题之前,我花了几个小时查看几个相似的答案。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." 
    } 
} 

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

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

任何建议将非常感激。

回答

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对象,相反到包含一个数组的单个数据。

+0

太感谢你了!所有的解决方案都可以工作,而你提供了最全面的解释。这不仅是正确的,但我完全忽略了其他的例子做放置json_encode函数while循环之外。我很抱歉没有注意到,并感谢您的时间。 – asraelarcangel 2012-02-19 20:22:53

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); 
+0

+1 from me too :-) – 2012-02-19 19:04:33

+0

谢谢你,这个也可以。 – asraelarcangel 2012-02-19 20:25:52

0

我认为你应该做

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

回声应该放置在循环之外。

+1

是的,但每次脚本经过while循环时,这将覆盖$ rows ['data'],所以它不会工作:) – Daan 2012-02-19 18:55:14

+1

谢谢,我没有注意到它只是复制并粘贴他的代码,但现在修复。 – 2012-02-19 19:01:49

+0

谢谢您的解决方案。我测试了它并且工作正常。 – asraelarcangel 2012-02-19 20:26:10

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! 
         } 

       } 
0

我一定花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"; 
}