jsonarrayparse
yipuran edited this page Jun 2, 2020
·
5 revisions
大量の配列要素(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<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);
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);