读取带有时间戳的json作为jsonobject键

时间:2016-12-23 21:09:38

标签: java json

我正在尝试使用java记录大学水文项目的天气数据。 在过去的24小时内,数据以5分钟的间隔格式化为json file,方式如下(例子):

{
   "1482439800":{
      "hu":92,
      "te":-2.9,
      "dp":-4.5,
      "pr":1028.4,
      "pa":null,
      "ws":1.4,
      "wd":180
   },
   "1482440100":{
      "hu":92,
      "te":-2.9,
      "dp":-4.5,
      "pr":1028.4,
      "pa":null,
      "ws":1.4,
      "wd":180
   }
}

我已经尝试使用以下代码访问json文件中的数据:

private static String readUrl(String urlString) throws Exception {
        BufferedReader reader = null;
        try {
            URL url = new URL(urlString);
            reader = new BufferedReader(new InputStreamReader(url.openStream()));
            StringBuffer buffer = new StringBuffer();
            int read;
            char[] chars = new char[1024];
            while ((read = reader.read(chars)) != -1)
                buffer.append(chars, 0, read); 

            return buffer.toString();
        } finally {
            if (reader != null)
                reader.close();
        }
    }
    public static Object[][] getstation1(){
        Object[][] data = null;
        try {
            JSONObject json = new JSONObject(readUrl("http://netzwerk.wetter.com/api/stationdata/14091/24/"));
            Iterator keys = json.keys();
            while (keys.hasNext()) {
                Object key = keys.next();
                JSONObject value = json.getJSONObject((String) key);
                double hu = value.getDouble("hu");
                System.out.println(hu);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return data;
    }

这有点成功,因为它返回了湿度(hu)的数据,但看似随机顺序。

现在我的问题是:我如何阅读时间并将它们与对象[] []内最新到最旧的相应天气数据一起返回?

感谢任何帮助。 谢谢。

2 个答案:

答案 0 :(得分:1)

有序地图比Object[][]更合适。

很快:

TreeMap<String, Object> sorted = new TreeMap<>(json.toMap());

但是这会按字面数字排序(在你的情况下可能很好,因为时间戳的长度都相同)。

您可以做更多的工作来将结果排序为类型化地图:

TreeMap<Date, Map<String, Double>> byDate = json.toMap().entrySet().stream()
    .collect(Collectors.toMap(
        e -> new Date(Long.valueOf(e.getKey()) * 1000),
        e -> (Map) e.getValue(),
        (a, b) -> {throw new IllegalArgumentException("Duplicate key " + a);},
        TreeMap::new
    ));

如果真的需要Object[][],您可以在数据排序后重新映射数据:

Object[][] data = sorted.entrySet().stream().map(e -> new Object[] {e.getKey(), e.getValue()}).toArray(Object[][]::new);

或者考虑使用jacksongson等对象映射器。

答案 1 :(得分:0)

感谢您的回答,但最后我决定采用稍微简单的路线。 我检索了所有的密钥名称,对它们进行了排序,然后按键读取相应的数据密钥。由于数据为空,我经常出错,我也加入了保护(我需要它们作为实际数字)。

public static Object[][] getstation1(){
        Object[][] data = null;
        try {
            JSONObject json = new JSONObject(readUrl("http://netzwerk.wetter.com/api/stationdata/14091/2/"));
            System.out.println("Fetching "+"http://netzwerk.wetter.com/api/stationdata/14091/2/");
            String[] times = json.getNames(json);
            Arrays.sort(times);
            data = new Object[times.length][8];
            for (int i = 0; i < times.length; i++){
                Date temp = new Date((long)Integer.parseInt(times[i])*1000);
                data[i][0] = temp;
                if (json.getJSONObject(times[i]).isNull("hu")){
                    data[i][1] = 0;
                } else {
                    data[i][1] = json.getJSONObject(times[i]).getDouble("hu");
                }   
                if (json.getJSONObject(times[i]).isNull("te")){
                    data[i][2] = 0;
                } else {
                    data[i][2] = json.getJSONObject(times[i]).getDouble("te");
                }   
                if (json.getJSONObject(times[i]).isNull("dp")){
                    data[i][3] = 0;
                } else {
                    data[i][3] = json.getJSONObject(times[i]).getDouble("dp");
                }   
                if (json.getJSONObject(times[i]).isNull("pr")){
                    data[i][4] = 0;
                } else {
                    data[i][4] = json.getJSONObject(times[i]).getDouble("pr");
                }   
                if (json.getJSONObject(times[i]).isNull("pa")){
                    data[i][5] = 0;
                } else {
                    data[i][5] = json.getJSONObject(times[i]).getDouble("pa");
                }   
                if (json.getJSONObject(times[i]).isNull("ws")){
                    data[i][6] = 0;
                } else {
                    data[i][6] = json.getJSONObject(times[i]).getDouble("ws");
                }   
                if (json.getJSONObject(times[i]).isNull("wd")){
                    data[i][7] = 0;
                } else {
                    data[i][7] = json.getJSONObject(times[i]).getDouble("wd");
                }                   
            }
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }       
        return data;
    }