java stream SONObject和JSONArray操作

轉自:https://zhuanlan.zhihu.com/p/36865573

1 取最後一條數據

stream對象存在方法findFirst,我們可以很方便的取到第一條數據,但它卻沒有findLast方法,需要取到最後一條數據,我們可以將數組逆序,然後再取最後一條數據:

JSONArray jsonArray = JSONArray.parseArray("[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]");
JSONObject jsonObject = (JSONObject)jsonArray.stream().sorted((a,b) -> -1).findFirst().get();
System.out.println(jsonObject);
/**
* out :
*      {"date":"2016-01-01","sex":"woman","name":"liming"}
**/

2 清空json對象中的某個數組(該數組位於JSON對象內部多層)

SONObject jsonObject = JSONObject.parseObject("{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}");
jsonObject.forEach((key, val) -> {
    JSONObject obj = (JSONObject) val;
    JSONArray array = obj.getJSONArray("childrens");
    array.clear();
    obj.put("childrens",array);
});
System.out.println(jsonObject);
/**
* out :
*      {"1":{"childrens":[],"sex":"man","name":"maple"}}
**/

3 收集對象屬性重新成一個數組

有時候我們需要對對象進行再次拼裝以形成我們方便使用的數據狀態:

JSONArray jsonArray = JSONArray.parseArray("[{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}]");
jsonArray = jsonArray.stream().map(obj -> {
JSONObject returnObj = new JSONObject();
    JSONObject jsonObj = (JSONObject)obj;
    jsonObj.forEach((key,val) -> {
        returnObj.put(key,((JSONObject)val).getJSONArray("childrens"));
    });
    return returnObj;
}).collect(Collectors.toCollection(JSONArray::new));
System.out.println(jsonArray);
/**
* out :
*      [{"1":[{"date":"2018-01-01","sex":"man","name":"草根"},{"date":"2017-01-01","sex":"woman","name":"merry"},{"date":"2016-01-01","sex":"woman","name":"liming"}]}]
**/

4 過濾數據並按時間字符串排序

 

JSONObject jsonObject = JSONObject.parseObject("{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Comparator<Object> dateComparator = (a, b) -> {
    int result = 0;
    try {
         Date dt1 = df.parse(((JSONObject)a).getString("date"));
         Date dt2 = df.parse(((JSONObject)b).getString("date"));
         result = dt1.compareTo(dt2);
    } catch (Exception ex) {
         ex.printStackTrace();
    } finally {
          return result;
    }
};
jsonObject.forEach((key, val) -> {
    JSONObject obj = (JSONObject) val;
    if (obj.getJSONArray("childrens") != null) {
          JSONArray array = obj.getJSONArray("childrens");
          array = array.stream().filter(arrObj -> !"merry".equals(((JSONObject) arrObj).getString("name")))
                  .sorted(dateComparator)
                  .collect(Collectors.toCollection(JSONArray::new));
          obj.put("childrens", array);
    } else {
            obj.put("childrens", new JSONArray());
    }
});
System.out.println(jsonObject);
/**
* out :
*      {"1":{"childrens":[{"date":"2016-01-01","sex":"woman","name":"liming"},{"date":"2018-01-01","sex":"man","name":"草根"}],"sex":"man","name":"maple"}}
**/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章