2012-02-19 30 views
6

Tôi đã dành một vài giờ để xem qua một số câu trả lời tương tự trước khi đăng sự cố của mình.PHP: không thể mã hóa json với nhiều hàng

Tôi đang truy xuất dữ liệu từ một bảng trong cơ sở dữ liệu của mình và tôi muốn mã hóa nó thành JSON. Tuy nhiên, đầu ra của json_encode() chỉ hợp lệ khi bảng có một hàng duy nhất. Nếu có nhiều hơn một hàng, kiểm tra tại http://jsonlint.com/ sẽ trả về lỗi.

Đây là câu hỏi của tôi:

$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); 
    } 

Đó được tôi JSON sau:

{ 
"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." 
    } 
} 

Khi tôi chạy thử nghiệm tại http://jsonlint.com/, nó sẽ trả về lỗi này:

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

Tuy nhiên, nếu tôi chỉ sử dụng nửa đầu của JSON ...

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

... hoặc nếu tôi chỉ kiểm tra nửa cuối ...

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

... cùng một thử nghiệm sẽ trở về "Áp dụng JSON".

Điều tôi muốn là có thể xuất ra trong một JSON [hợp lệ] duy nhất mỗi hàng trong bảng.

Mọi đề xuất sẽ được đánh giá rất nhiều.

Trả lời

14

Vấn đề là bạn đang phun ra riêng JSON cho mỗi hàng, như trái ngược với làm việc đó tất cả cùng một lúc.

$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); 

Thay đổi nhỏ mà tôi đã thực hiện là lưu trữ mỗi hàng của cơ sở dữ liệu dưới dạng giá trị mới trong mảng $rows. Điều này có nghĩa là khi hoàn thành, mảng $rows của bạn chứa tất cả trong số các hàng từ truy vấn của bạn và do đó bạn có thể nhận được kết quả chính xác khi kết thúc. Vấn đề với giải pháp của bạn là bạn đang lặp lại JSON hợp lệ cho một hàng của cơ sở dữ liệu, nhưng json_encode() không biết về tất cả các hàng khác, vì vậy bạn đang nhận được một loạt các đối tượng JSON riêng lẻ, như trái ngược với cho một đơn chứa một mảng.

+0

Cảm ơn bạn rất nhiều! Tất cả các giải pháp hoạt động, và của bạn cung cấp giải thích toàn diện nhất. Không chỉ điều này là chính xác, nhưng tôi hoàn toàn bỏ qua các ví dụ khác không đặt hàm json_encode bên ngoài vòng lặp while. Tôi xin lỗi vì không nhận thấy, và cảm ơn bạn đã dành thời gian của bạn. – asraelarcangel

3

Bạn cần thay đổi mã PHP của bạn vào một cái gì đó như thế này:

$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 từ tôi :-) –

+0

Cảm ơn bạn, điều này cũng hoạt động. – asraelarcangel

0

Tôi nghĩ rằng bạn nên làm

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

tiếng vang nên được đặt bên ngoài vòng lặp.

+1

có, nhưng điều này sẽ ghi đè lên hàng $ ['dữ liệu'] mỗi khi tập lệnh đi qua vòng lặp while, vì vậy nó sẽ không hoạt động :) – Daan

+1

Cảm ơn, tôi không nhận thấy nó chỉ sao chép và dán mã của anh ấy nhưng đã sửa . –

+0

Cảm ơn bạn đã giải pháp. Tôi đã thử nghiệm nó và hoạt động tốt. – asraelarcangel

0

Tôi đã cố gắng như nhau trong PHP của tôi, vì vậy tôi đã whit này ...

$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); 
    } 

Và, trong Class Android của tôi ...

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

tôi phải dành 15 giờ về vấn đề này.Mọi biến thể được thảo luận ở trên đã được thử. Cuối cùng tôi đã có thể có được 'giải pháp tiêu chuẩn' làm việc. Vấn đề, rất kỳ quặc, có vẻ như vậy:

Khi khoảng thời gian được đặt vượt quá 14 giờ, json dường như không thể phân tích cú pháp. Phải có giới hạn đối với 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"; 
}