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

标签 java json parsing functional-programming jackson

我正在使用包含 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 数组( 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 并不表示这有任何问题,并且不存在编译时问题。然而,在运行时,我遇到了异常

严重:com.fasterxml.jackson.databind.JsonMappingException:无法从 START_ARRAY token 中反序列化 org.primefaces.json.JSONArray 的实例。

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

最佳答案

JSONArray 版本 7.0实现 Iterable 所以你可以做这样的事情:

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

另请参阅:

关于java - 将包含 JSON 数组的 JSONArray 对象解析为 JSON 数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57853242/

相关文章:

mysql - 如何从 MySQL 中的数字键嵌套 JSON 字段中提取值

c# - 创建一个与 iPhone 进行 JSON 通信的 ASP.NET Web 服务

javascript - AngularJS/解析 $http --data-urlencode

Java反序列化,将字段更改为 transient

java - ActivePivot 实时推送分析维度

json - 如何解码具有剩余值的异构数组作为列表

parsing - 如何使用 ANTLR 正确解析泛型类型?

java复杂逻辑条件解析器

java - 是否有可能缩短检查单个变量的一堆不同值的条件语句

java - Double.NaN 是一个对象