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

Java 将包含JSON数组的JSONArray对象解析为JSON数组列表,java,json,parsing,functional-programming,jackson,Java,Json,Parsing,Functional Programming,Jackson,我正在使用包含JSON数组的PrimeFaces JSONArray对象,例如(简化) 作为静态构建方法的输入,该方法在嵌套数组的字段上运行,以构造表示其数据的POJO。我在实体类的实体和容器中使用静态构建方法来实现这一点(后者只是解析JSON并调用前一个构建方法来构建每个实体)。这适用于原油循环: public static MyContainer buildContainer(JSONArray json) { MyContainer list = new MyContainer (

我正在使用包含JSON数组的PrimeFaces JSONArray对象,例如(简化)

作为静态构建方法的输入,该方法在嵌套数组的字段上运行,以构造表示其数据的POJO。我在实体类的实体和容器中使用静态构建方法来实现这一点(后者只是解析JSON并调用前一个构建方法来构建每个实体)。这适用于原油循环:

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;
}
Netbeans并不表示这有什么问题,也不存在编译时问题。然而,在运行时,我得到了异常

Severe:com.fasterxml.jackson.databind.JsonMappingException:无法反序列化org.primefaces.json.JSONArray的实例,使其脱离START\u数组令牌。


因此,我的问题是,当输入的格式是我上面所示的格式时,为什么会出现这种异常,以及是否有比将JSONArray序列化为字符串然后将其读回为JSONArray[]更优雅的解决方案,也就是说,我能更直接地将初始JSONArray转换为允许
.stream()的类型吗
.forEach()

JSONArray
在版本中实现了
Iterable
,因此您可以执行以下操作:

StreamSupport
  .stream(iterable.spliterator(), false)
  .map(MyEntity::buildEntity)
  .collect(Collectors.toList());
另见:


    • MyEntity
      是一个
      POJO
      ,数组中每个元素有3个属性:
      ['james',12,2019]
      ?它看起来像是
      MyContainer
      实现了
      List
      界面。为什么您需要自己的实现?这是一个简化的示例;实际情况中有更多字段,具有各种数据类型。我的容器类不实现列表;它是一个带有附加字段的自定义列表,因为它还需要包含关于其中对象的统计信息。这在应用程序的其他地方使用,但与这里的问题无关。从哪个包
      JSONArray
      类来的?它是org.primefaces.json.JSONArray的一个实例,正如您在我发布的异常谢谢您中看到的,这正是我所需要的。在调用构建方法
      {java}public static MyContainer build(JSONArray json){返回fromList(StreamSupport.stream(json.spliterator(),false).map(array->(JSONArray)array).map(MyEntity::buildEntity).collect(Collectors.toList());}
      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;
          }
      }
      
      StreamSupport
        .stream(iterable.spliterator(), false)
        .map(MyEntity::buildEntity)
        .collect(Collectors.toList());