簡體   English   中英

將包含JSON數組的JSONArray對象解析為JSON數組列表

[英]Parsing a JSONArray object, containing JSON arrays, to a list of JSON arrays

我正在使用包含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());

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM