2016-05-07 27 views
6

La mia app Android si collega a Firebase e richiama "Alert Objects" che vengono inviati lì dal mio server.Android Firebase - Impossibile ricevere JSON corretto dall'istantanea Firebase

Quando esporto i dati da Firebase, ottengo una rappresentazione JSON dei dati ottimamente formata.

Problema: Quando trasferisco i dati sul mio dispositivo Android utilizzando DataSnapshot, i dati hanno '=' (segni di uguale) invece di ':' (punto e virgola). Anche le quotazioni non ci sono.

Quando provo a fare qualcosa come JSONObject alert = new JSONObject(data.getValue().toString()); ottengo errori per ovvi motivi. Dico ovvio perché se si guarda ciò che il mio codice stampa sulla console si può vedere che non è più in formato JSON valido.

Un amico ha detto che ho bisogno di fare qualcosa con la codifica, ma non abbiamo avuto il tempo di discuterne.

Come posso scorrere questi oggetti di avviso (un po 'strani) che ho creato e trasformarli in oggetti JSON all'interno di Java in modo da poter accedere alle loro proprietà come alert.date e alert.message.

Pensavo che gli screenshot ti aiutassero a vedere quello che sto facendo. Il firebase non è protetto per cui puoi sentirti libero di dargli un'occhiata. Non farà molto e quando andrò in produzione lo sposterò comunque.

Firebase screenshot

JSON export straight from Firebase website

Code in Android Studio to print each object to console

Output to console when running app

Sono sicuro che questa è una domanda super facile da rispondere, io sono solo non troppo ben versati con JSON e la codifica nel suo complesso .

Grazie!

+1

Hai incluso una foto dell'albero JSON nella sua interrogazione. Sostituiscilo con il JSON attuale come testo, che puoi facilmente ottenere facendo clic sul pulsante Esporta nel database di Firebase. Avere il JSON come testo lo rende ricercabile, ci permette di usarlo facilmente per testare con i tuoi dati reali e usarlo nella nostra risposta e in generale è solo una buona cosa da fare. –

+2

@FrankvanPuffelen Questa è una schermata del testo esportato Firebase. Sono sul mio telefono adesso ma quando torno a casa caricherò il testo ricercabile. Quello che vedi è il 99% di esso però. Sono solo poche altre righe. – Ryan

risposta

6

Non è possibile accedere a JSON nativamente in Java.

Ma lo Firebase DataSnapshot class fornisce tutto ciò che serve.

Se si dispone di un DataSnapshot dei dati presso il fbAlerts nella vostra schermata, è possibile stampare la data + messaggio e destinatari per ogni:

for (DataSnapshot alert: alerts.getChildren()) { 
    System.out.println(alert.child("date").getValue(); 
    System.out.println(alert.child("message").getValue(); 
    for (DataSnapshot recipient: alert.child("recipients").getChildren()) { 
    System.out.println(recipient.child("name").getValue(); 
    } 
} 

In alternativa, è possibile costruire una classe Java che rappresenta un avviso . Vedere lo Firebase guide on reading data in Android per alcuni esempi.

+1

Grazie e scusa per la mia risposta in ritardo. Ho finito per capirlo subito dopo aver postato la domanda. Beh, lo sapevo già per la maggior parte, speravo solo che ci fosse un modo più semplice. Il mio codice ora è un po '... rozzo? ... ma fa in modo che ogni bambino utilizzi questi per i loop e costruisca correttamente i miei oggetti. Grazie ancora! – Ryan

+1

Da dove provengono gli avvisi variabili? alerts.getChildren() .. – JoCuTo

+0

same prob ... "Impossibile risolvere il simbolo" Avvisi "" –

0

Dall'estrazione del codice precedente, sembra che si disponga di un oggetto JSONArray anziché di un oggetto JSONObject.

In questo caso, è necessario fare qualcosa di simile al seguente:

// Find the right array object 
JSONArray jsonArray = response.getJSONArray("fbAlerts"); 

// Loop through the array 
for (int i=0; i< jsonArray.length(); i++) { 
    JSONObject myObj = jsonArray.getJSONObject(i); 
    strMsg = myObj.getString("message"); 
} 

Nell'esempio - quando si hanno a ripetere i gruppi, questo sembrerebbe indicare una matrice e quindi ha bisogno di un iteratore per accedere all'oggetto contenuto.

+2

Grazie per la risposta. Ho finito per incanalare il figlio di ciascun genitore, in realtà alcuni "bambini" e ho costruito manualmente i miei oggetti. – Ryan

2

Utilizzare questo modo per convertire il JsonObject formano il dataSnapshot

Map<String, String> value = (Map<String, String>) dataSnapshot.getValue(); 
Log.i("dataSnapshot", "dataSnapshot" + new JSONObject(value)); 
+0

Come possiamo convertirlo nuovamente in Datasnapshot? –

3

te è possibile utilizzare GSON biblioteca

 public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      /*JSONObject jsonObject = null; 
      try { 
       jsonObject=new JSONObject(); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      }*/ 
      Gson gson = new Gson(); 
      String s1 = gson.toJson(dataSnapshot.getValue()); 
      JSONArray object = null; 
      try { 
       object = new JSONArray(s1); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      JSONArray jsonArray = object; 

      Log.e("string", s1); 

     } 
Problemi correlati