Skip to content

jsonarrayparse

yipuran edited this page Jun 2, 2020 · 5 revisions

Big JSON Arrayの読込み

大量の配列要素(JsonArray の中の要素が大量)において、

  • Consumer<T>として実行する。
  • Stream<T>を取得する。
  • Json-PATHとvalue の Map.Entry のStream取得

を org.yipuran.gsonhelper.array.JsonArrayParser で実現する。

以下を準備して、

  • 配列のPATH
  • 配列要素をJavaオブジェクトにする為のGson を生成するGsonBuilder
  • JsonReader

JsonArrayParseBuilderの生成(GsonBuilderと対象クラス指定) ⇒ PATHの指定 ⇒ JsonArrayParseをビルド、⇒ JsonReader で解析実行 ⇒ Consumer<T> 実行 or Stream<T>取得、or Stream<Map.Endtry<String. Object>>取得

という流れに従う。

使用例、

JSON

{
  "group":{
    "title": "alpha",
    "itemlist":[
       {
          "name": "A",
          "flag": true,
          "time": "2020/06/05 22:14:25"
       },
      //  大量に、要素が並んでいる。。。
       {
          "name": "xxxx",
          "flag": true,
          "time": "2020/06/04 08:54:09"
       }
    ]
  }
}

Item.class として読み取る。JsonReader reader は生成されている。

JsonArrayParseBuilder.<Item>of(new GsonBuilder().serializeNulls()
 .registerTypeAdapter(LocalDateTime.class, LocalDateTimeAdapter.of("yyyy/MM/dd HH:mm:ss"))
, TypeToken.get(Item.class).getType())
.path("group", "itemlist")
.create()
.execute(reader, t->{
	 // t = Item
});

このTypeToken.get(Item.class).getType() は、 com.google.gson.reflect.TypeToken である。 JsonArrayParseBuilder#of メソッドは、Type の代わりに Class<T>を渡しても良い。

Stream の取得

Stream<Item> stream =
JsonArrayParseBuilder.<Item>of(new GsonBuilder().serializeNulls()
 .registerTypeAdapter(LocalDateTime.class, LocalDateTimeAdapter.of("yyyy/MM/dd HH:mm:ss"))
, TypeToken.get(Item.class).getType())
.path("group", "itemlist")
.create()
.stream(reader);

Stream<Map.Endtry<String. Object>> 取得

Map.Endtry の key は、JSON-PATH

Stream<Map.Endtry<String. Object>> stream =
JsonArrayParseBuilder.<Item>of(new GsonBuilder().serializeNulls()
 .registerTypeAdapter(LocalDateTime.class, LocalDateTimeAdapter.of("yyyy/MM/dd HH:mm:ss"))
, TypeToken.get(Item.class).getType())
.path("group", "itemlist")
.create()
.mapstream(reader);