【问题标题】:Weird JSON (Logic) Error?奇怪的 JSON(逻辑)错误?
【发布时间】:2012-03-30 14:01:30
【问题描述】:

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 下找到。

为什么会发生这种情况?有没有人解决这个问题?

【问题讨论】:

    标签: android json android-asynctask


    【解决方案1】:

    那是因为 JSONObject 可能使用简单的 Map(不是排序的)来存储字段/值组合。实际上,解决方案是更新您的 JSON。问题是您需要一系列费率。像这样:

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

    其实我撒谎了,汇率应该是这样的:

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

    编辑: 要对结果进行排序,首先将它们存储到具有 String 字段和 Double 字段的对象中,然后您可以按名称对其进行排序并按顺序显示。

    【讨论】:

    • 所以我应该将此 json 文件保存到 Android 中的 raw 文件夹中,然后对其进行编辑,使其看起来像您所显示的那样?因为这不是我的json。另一位用户将我引导至该网站:)
    • 好吧,我假设您可以控制 JSON,如果您不这样做,那么您将不得不手动将未排序的格式转换为您可以排序的模型。
    【解决方案2】:

    如果您查看 android 文档,它会说:

    返回此对象中字符串名称的迭代器。返回的 iterator 支持remove,会移除对应的mapping 从这个对象。如果这个对象在迭代器被修改之后 返回时,迭代器的行为未定义。 键的顺序 未定义。

    因此,您必须使用不同的方法。也许试试JSONObject.names()?或者,只需将所有键值对添加到一个数组中,然后对其进行排序,并使用该顺序,因为它看起来只是一个简单的字母排序。

    【讨论】:

    • 感谢您指出 android 文档。我会先试试你说的,因为我不想使用文件,我希望应用程序访问网络。
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多