【问题标题】:How do I retrieve a JSONObject subfield?如何检索 JSONObject 子字段?
【发布时间】:2019-12-12 22:52:39
【问题描述】:

我一直在寻找这个。我正在使用 exchangerate API,我需要一些关于 json 响应的帮助。我想获取 CAD 的日期和 Double 值。

这是我拥有的 JSONObject:

{"rates":{"2019-11-27":{"CAD":1.3266418385},
    "2019-11-28":{"CAD":1.3289413903},
    "2019-12-03":{"CAD":1.3320386596},
    "2019-12-02":{"CAD":1.3295835979},
    "2019-11-29":{"CAD":1.3307230013}},
    "start_at":"2019-11-27","base":"USD","end_at":"2019-12-03"}

我的活动

公共类 ChartActivity 扩展 AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chart);
        new GetServerData(this).execute();
    }

    private static class GetServerData extends AsyncTask<Integer, Void, List<BarEntry>> {
        private static final int TIMEOUT = 30000;
        private static final String BASE_URL = "https://api.exchangeratesapi.io/history?start_at" +
                "=2019-11-27&end_at=2019-12-03&base=USD&symbols=CAD";
        private WeakReference<ChartActivity> activityReference;

        GetServerData(ChartActivity context) {
            activityReference = new WeakReference<>(context);
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected List<BarEntry> doInBackground(Integer... integers) {
            List<BarEntry> barEntries = new ArrayList<>();
            OkHttpClient client = new OkHttpClient().newBuilder()
                    .readTimeout(TIMEOUT, TimeUnit.SECONDS)
                    .connectTimeout(TIMEOUT, TimeUnit.SECONDS)
                    .writeTimeout(TIMEOUT, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                    .build();
            Request request = new Request.Builder()
                    .url(BASE_URL)
                    .build();
            try {
                Response response = client.newCall(request).execute();
                Log.d("Response", response.toString());
                JSONObject object = new JSONObject(Objects.requireNonNull(response.body()).string());
                JSONObject rates = object.getJSONObject("rates");
                Iterator<String> iterator = rates.keys();
                while (iterator.hasNext()) {
                    /* what i should write here to get the date and double values which is in 
                     JSONObject.*/

                    //barEntries.add(new BarEntry(int required of date, float required of value ));
                }
            } catch (IOException | JSONException e) {
                e.printStackTrace();
                Log.d("ChartActivity", e.toString());
            }
            return barEntries;
        }

        @Override
        protected void onPostExecute(final List<BarEntry> result) {
            final ChartActivity activity = activityReference.get();
            if (activity == null || activity.isFinishing()) {
                return;
            }
            BarChart barChart = activity.findViewById(R.id.bar_chart);

            BarDataSet dataSet = new BarDataSet(result, "Growth");
            dataSet.setColors(ColorTemplate.COLORFUL_COLORS);
            BarData barData = new BarData(dataSet);
            barData.setBarWidth(0.9f);
            barChart.animateY(5000);
            barChart.setData(barData);
            barChart.setFitBars(true);
            Description description = new Description();
            description.setText("Growth rate per week");
            barChart.setDescription(description);
            barChart.invalidate();

        }
    }
}

如您所见,我想检索数据以显示图表 请帮忙!

【问题讨论】:

    标签: java android json retrofit


    【解决方案1】:

    你可以试试这个。没有时间测试它,但希望它有所帮助:

    JSONObject rates = object.getJSONObject("rates");
    Iterator<String> iterator = rates.keys();
    while (iterator.hasNext()) {
        String keyDate = iterator.next(); // the date
        String cad = rates.getJSONObject(keyDate).getString("CAD"); // the numeric
    }
    

    编辑:

    这远离了 JSON 主题,但是可以像这样将日期字符串转换为数字。您必须弄清楚正确的日期格式。

    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");  
    try {  
        Date date = formatter.parse("31/03/2015");  
        System.out.println("Date as milliseconds from 1.1.1970: "+date.getTime());  
    } catch (ParseException e) {e.printStackTrace();}  
    

    【讨论】:

    • 我认为你应该使用getDouble("CAD") 来表示速率。
    • 好的,非常感谢,我现在就尝试测试一下,如果一切顺利,我会告诉你
    • @LHCHIN 你的意思是我应该在哪里写 getDouble("CAD")?
    • 我得到了日期和数字,但我想将日期解析为 int,将数字解析为浮点数,当我使用 Integer.parseInt 和 Float.parseFloat 时出现此错误:原因:java.lang .NumberFormatException:对于输入字符串:“2019-11-27”
    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2015-12-25
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多