Странная ошибка JSON (логика)? - PullRequest
0 голосов
/ 30 марта 2012

Привет программистов Android,

Я работаю над анализом веб-сайта в моем приложении.

Это веб-сайт: https://raw.github.com/currencybot/open-exchange-rates/master/latest.json

Проблема с этим сегментом кода заключается в том, что он не получает ставки в порядке .

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

Для проверки этого класса я использовал следующую строку кода:

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

Ответ должен быть 3.6733 (если вы посмотрите на веб-сайт), потому что это первый рейтинг в ArrayList. Тем не менее, он возвращает 82,894997, который позже находится под JPY.

Почему это происходит? У кого-нибудь есть исправление для этого?

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

Если вы посмотрите в документации Android, он говорит:

Возвращает итератор имен String в этом объекте.Возвращенный итератор поддерживает удаление, которое удалит соответствующее отображение из этого объекта.Если этот объект изменяется после того, как итератор возвращается, поведение итератора не определено. Порядок ключей не определен.

Поэтому вы должны использовать другой метод.Может быть, попробовать JSONObject.names()?Или, может быть, просто добавьте все пары ключ-значение в массив, затем отсортируйте его и используйте этот порядок, поскольку похоже, что это всего лишь простая сортировка по алфавиту.

0 голосов
/ 30 марта 2012

Это может быть связано с тем, что JSONObject, вероятно, использует простую карту (а не отсортированную) для хранения комбинаций полей и значений.Решение состоит в том, чтобы обновить ваш JSON, на самом деле.Проблема в том, что вам нужен массив ставок.Например:

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

На самом деле, я солгал, ставка должна выглядеть следующим образом:

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

Редактировать: чтобы отсортировать результаты, сначала сохраните их в объект с полем String.и поле Double, затем вы можете отсортировать их по имени и отобразить их по порядку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...