2012-03-30 14 views
0

こんにちはAndroidのプログラマー、奇妙なJSON(論理)エラー?

私は自分のアプリケーションでウェブサイトを解析中です。

これは、ウェブサイトである:https://raw.github.com/currencybot/open-exchange-rates/master/latest.json

このコードセグメントでの問題は、それがために金利を取得していないことです。 (あなたがウェブサイトを見れば)、それはArrayListの中に最初の割合であるので答えは、3.6733である必要があり

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

:このクラスをテストする

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

、私は次のコード行を使用しました。ただし、82.894997が返されます。これは後でJPYで検出されます。

なぜこれが起こっていますか?誰にもこれに対する修正がありますか?

答えて

0

これは、JSONObjectがフィールド/値の組み合わせを格納するために単純なマップ(並べ替えられたマップではない)を使用している可能性があるためです。解決策は、JSONを実際に更新することです。問題は、レートの配列が欲しいということです。このように:最初の文字列フィールドを持つオブジェクトとダブルにそれらを保存し、結果をソートするには :

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

編集:

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

実は、私は嘘をついた、レートは次のようになります。フィールドを選択すると、名前で並べ替えて並べ替えることができます。

+0

私はこのjsonファイルをAndroidの生のフォルダに保存して、それをあなたが見たように編集する必要がありますか?これは私のjsonではないので。別のユーザーが私をこのサイトに誘導しました:) – sameetandpotatoes

+0

あなたのアップデートdmonのおかげで、JSONをどのように更新するのですか? – sameetandpotatoes

+0

さて、私はあなたがJSONのコントロールを持っていると仮定しましたが、そうでなければ、ソートされていないフォーマットをソートできるモデルに手動で変換する必要があるだけです。 – dmon

0

あなたはアンドロイドのドキュメントを見ると、それは言う:このオブジェクトの文字列名のイテレータを返します

を。返された イテレータはremoveをサポートしており、対応するマッピング がこのオブジェクトから削除されます。イテレータが の後にこのオブジェクトが変更された場合、イテレータの動作は未定義です。 のキーの順序は未定義です。

したがって、別の方法を使用する必要があります。おそらくJSONObject.names()を試してみますか?あるいは、単純なアルファベット順のように見えるので、すべてのキーと値のペアを配列に追加してソートし、その順序を使用するだけです。

+0

アンドロイドのドキュメントを指摘してくれてありがとう。あなたが最初に言ったことを試してみます。私はファイルを使いたくないので、アプリケーションがWebにアクセスしたいと思っています。 – sameetandpotatoes