2012-03-30 21 views
0

Hallo Android Programmierer,Weird JSON (Logik) Fehler?

Ich arbeite an der Analyse einer Website in meiner Anwendung.

Dies ist die Website: https://raw.github.com/currencybot/open-exchange-rates/master/latest.json

Das Problem mit diesem Code-Segment ist, dass es nicht die Preise um erhält.

private class DownloadWebPageTask extends AsyncTask<String, Void, ArrayList<Double>> 
{ 
    protected ArrayList<Double> doInBackground(String... urls) 
    { 
     ArrayList<Double> response = new ArrayList<Double>(); 
     for (String url : urls) 
     { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try 
      { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 
       InputStreamReader isr = new InputStreamReader(content); 
       StringBuilder sb = new StringBuilder(); 
       char[] buffer = new char[1024]; 
       while (isr.read(buffer) != -1) 
       { 
        sb.append(buffer); 
       } 
       JSONObject jobj = new JSONObject(sb.toString()); 
       JSONObject ratesObj = jobj.getJSONObject("rates"); 
       Iterator<String> keys = ratesObj.keys(); 
       while (keys.hasNext()) 
       { 
        response.add(Double.parseDouble(ratesObj.getString(keys.next()))); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
    @Override 
    protected void onPostExecute(ArrayList<Double> result) 
    { 
     currency_values = result; 
    } 

diese Klasse zu testen, habe ich die folgende Codezeile:

test.setText(currency_values.get(0).toString()); //test is a TextView 

Die Antwort sollte 3,6733 (wenn Sie auf der Website anschauen), weil es die erste Rate in der Arraylist ist . Es gibt jedoch 82.894997 zurück, die später unter JPY gefunden wird.

Warum würde das passieren? Hat jemand eine Lösung dafür?

Antwort

0

Das liegt daran, dass JSONObject wahrscheinlich eine einfache Map (keine sortierte) verwendet, um die Feld/Wert-Kombinationen zu speichern. Die Lösung besteht darin, Ihren JSON tatsächlich zu aktualisieren. Das Problem ist, dass Sie eine Reihe von Raten möchten. Wie folgt aus:

"rates": [ 
    { "AED": 3.6733 }, 
    {"AFN": 48.32}, 
    {"ALL": 104.959999}, 
    ... 
] 

Eigentlich log ich, sollte eine Rate wie folgt aussehen:

{ "key": "AED", 
    "value": 3.6733 
} 

Edit: Um die Ergebnisse zu sortieren, speichern sie zunächst in ein Objekt mit einem String-Feld und einem Doppel Feld, dann können Sie sie nach Namen sortieren und in der Reihenfolge anzeigen.

+0

Also sollte ich diese JSON-Datei in den rohen Ordner in Android speichern, und bearbeiten Sie es dann so, wie es aussieht, was Sie gezeigt haben? Weil das nicht mein Json ist. Ein anderer Benutzer hat mich auf diese Seite geleitet :) – sameetandpotatoes

+0

Ok danke für dein Update dmon, wie aktualisiere ich den JSON? – sameetandpotatoes

+0

Nun, ich nahm an, Sie hatten die Kontrolle über die JSON, wenn Sie das nicht tun, dann müssen Sie nur das unsortierte Format manuell in ein Modell konvertieren, das Sie sortieren können. – dmon

0

Wenn Sie in der Android-Dokumentation suchen, heißt es:

Gibt einen Iterator des String-Namen in diesem Objekt. Der zurückgegebene Iterator unterstützt remove, wodurch die entsprechende Zuordnung von diesem Objekt entfernt wird. Wenn dieses Objekt geändert wird, nachdem der Iterator zurückgegeben wurde, ist das Verhalten des Iterators nicht definiert. Die Reihenfolge der Tasten ist nicht definiert.

Daher müssen Sie eine andere Methode verwenden. Vielleicht versuchen Sie JSONObject.names()? Oder fügen Sie einfach alle Schlüssel/Wert-Paare zu einem Array hinzu, sortieren Sie es und verwenden Sie diese Reihenfolge, da es aussieht, als wäre es nur eine einfache alphabetische Sortierung.

+0

Danke, dass du auf die Android-Dokumentation hingewiesen hast. Ich werde versuchen, was Sie zuerst gesagt haben, weil ich keine Datei verwenden möchte, möchte ich die Anwendung auf das Web zugreifen. – sameetandpotatoes