为了账号安全,请及时绑定邮箱和手机立即绑定

将包含 JSON 数组的 JSONArray 对象解析为 JSON 数组列表

将包含 JSON 数组的 JSONArray 对象解析为 JSON 数组列表

婷婷同学_ 2023-07-19 16:11:27
我正在使用包含 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条经验 获得超12个赞

JSONArray在7.0版本中实现了Iterable,所以你可以这样做:

StreamSupport
  .stream(iterable.spliterator(), false)
  .map(MyEntity::buildEntity)
  .collect(Collectors.toList());
查看完整回答
反对 回复 2023-07-19
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信