我正在使用包含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解析为JSONArrays数组(即
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()
的类型? 最佳答案
版本7.0中的JSONArray
实现了Iterable
,因此您可以执行以下操作:
StreamSupport
.stream(iterable.spliterator(), false)
.map(MyEntity::buildEntity)
.collect(Collectors.toList());
也可以看看:
Convert Iterable to Stream using Java 8 JDK
关于java - 将包含JSON数组的JSONArray对象解析为JSON数组列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57853242/