2012-02-19 10 views
6

Spędziłem kilka godzin przeglądając kilka podobnych odpowiedzi przed opublikowaniem mojego problemu.PHP: nie można kodować json z wieloma wierszami

Pobieram dane z tabeli w mojej bazie danych i chcę je zakodować w JSON. Jednak wynik polecenia json_encode() jest poprawny tylko wtedy, gdy tabela ma jeden pojedynczy wiersz. Jeśli istnieje więcej niż jeden wiersz, test pod numerem http://jsonlint.com/ zwraca błąd.

To moje zapytanie:

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

że dostaje mi następujący 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." 
    } 
} 

Kiedy wykonać test na http://jsonlint.com/, zwraca błąd:

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

Jeśli jednak używam tylko tej pierwszej połowy JSON ...

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

... czy mogę przetestować tylko drugą połowę ...

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

... ten sam test powróci "valid" JSON.

To, czego chcę, to móc wydrukować w jednym pojedynczym [poprawnym] JSON w każdym wierszu w tabeli.

Wszelkie sugestie będą bardzo mile widziane.

Odpowiedz

14

Problem polega na ty wypluwa oddzielny JSON dla każdego rzędu, w przeciwieństwie do robić to wszystko na raz.

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

drobna zmiana Zrobiłem to, aby zapisać każdy wiersz w bazie danych jako nowej wartości w tablicy $rows. Oznacza to, że po jej zakończeniu Twoja tablica zawiera wszystkie wiersze z zapytania, co pozwala uzyskać poprawny wynik po zakończeniu.

Problem z rozwiązaniem polega na tym, że echo poprawnego JSON dla jednego wiersza bazy danych, ale json_encode() nie wie o wszystkich innych wierszach, więc uzyskuje się szereg pojedynczych obiektów JSON, w przeciwieństwie do do pojedynczego zawierającego tablicę.

+0

Dziękuję bardzo! Wszystkie rozwiązania działają, a Twoja zawiera najbardziej wyczerpujące wyjaśnienie. Nie tylko to jest poprawne, ale całkowicie przeoczyłem inne przykłady, aby umieścić funkcję json_encode poza pętlą while. Przepraszam, że nie zauważyłem i dziękuję za poświęcony czas. – asraelarcangel

3

Musisz zmienić swój kod PHP w coś takiego:

$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 ode mnie :-) –

+0

Dziękuję, to też działa. – asraelarcangel

0

myślę, że należy zrobić

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

echo powinny być umieszczone na zewnątrz pętli.

+1

tak, ale to spowoduje nadpisanie $ rows ['data'] za każdym razem, gdy skrypt przejdzie przez pętlę while, więc to nie zadziała :) – Daan

+1

Dzięki, nie zauważyłem, że po prostu skopiowałem i wkleiłem jego kod, ale naprawiłem teraz . –

+0

Dziękujemy za rozwiązanie. Sprawdziłem to i działa dobrze. – asraelarcangel

0

Próbowałem to samo w moim PHP, więc doszedłem odrobina tego ...

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

A w mojej klasie 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

muszę spędził 15 godzin w tej sprawie.Każda wariacja omówiona powyżej została wypróbowana. W końcu udało mi się sprawić, że "standardowe rozwiązanie" działa. Wydaje się to bardzo dziwne:

Po upływie przedziału czasu powyżej 14 godzin json wydaje się niezdolny do jego analizy. Musi istnieć ograniczenie dla 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"; 
} 
Powiązane problemy