我正在使用包含 JSON 數組的 PrimeFaces JSONArray 對象,例如(簡化)[['james', 12, 2019], ['sarah', 29, 2015], ['robert', 15, 2011]]作為靜態構建方法的輸入,該方法在嵌套數組的字段上運行以構造表示其數據的 POJO。我在實體類和實體容器類中使用靜態構建方法來實現這一點(后者只是解析 JSON 并調用前一個構建方法來構造每個實體)。這對于粗略的 for 循環來說效果很好:public static MyContainer buildContainer(JSONArray json) { MyContainer list = new MyContainer (); for (int i = 0; i < json.length(); i++) { MyEntity ent = MyEntity.buildEntity(json, i); list.add(ent); } return list;}但我想要一種更優雅的解決方案,特別是使用函數式方法的解決方案(如果沒有更好的理由,可以提高我對函數式 Java 的了解)。我使用 Jackson 將表示完整數據集的 JSONArray 解析為 JSONArray 數組(即a JSONArray[])。然后可以將該數組轉換為列表,這樣可以更輕松地進行功能操作。這是我最初嘗試寫下我的想法,這可能表明了對 Jackson 和函數式 Java 的一些基本誤解:public static MyContainer buildContainer(JSONArray json) { ObjectMapper mapper = new ObjectMapper(); try { JSONArray[] jaArr = mapper.readValue(json.toString(), JSONArray[].class); List<JSONArray> jaList = Arrays.asList(jaArr); MyContainer list = (MyContainer) (List<MyEntity>) Arrays.asList(json) .stream() .map(MyEntity::buildEntity) .collect(Collectors.toList()); return list; } catch (JsonProcessingException ex) { return null; }}Netbeans 并不表明這有什么問題,并且不存在編譯時問題。然而,在運行時,我得到了異常Severe: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.primefaces.json.JSONArray out of START_ARRAY token.所以,我的問題是,當輸入采用上面所示的格式時,為什么會出現此異常,以及是否有比將 JSONArray 序列化為字符串然后將其讀回為 JSONArray[] 更優雅的解決方案 – 即我可以嗎將我的初始 JSONArray 更直接地轉換為允許.stream()或.forEach()?
1 回答

紅顏莎娜
TA貢獻1842條經驗 獲得超13個贊
JSONArray
在7.0版本中實現了Iterable
,所以你可以這樣做:
StreamSupport ??.stream(iterable.spliterator(),?false) ??.map(MyEntity::buildEntity) ??.collect(Collectors.toList());
添加回答
舉報
0/150
提交
取消