gson

gson でJSON読み込んで、Key と Value

先日、Jackson でJSON読込み key-value の BiConsumer を処理する - Oboe吹きプログラマの黙示録Jackson でJSON読込み key-value の Stream生成 - Oboe吹きプログラマの黙示録 を書いたので、gson で同じことをします。JSONキーは、"." で区切り、配列は、[n…

Map<String, Object> へのデシリアライズ

gson の欠点として、以前から悩んでたのが、Map<String, Object> へのデシリアライズで、 数値が、Long 、Integer ではなく、Double に変換されるように認識してしまうことだった。 過去、 Google gson fromJson で、 Map<String, Object> への変換は落とし穴。。。 - Oboe吹きプログラマの黙</string,></string,>…

Gsonで未整形JSON を人が見やすいように整形する。

Google gson の JsonWriter の setIndent の方法ではなく、gson インスタンスを生成する前の GsonBuilder で、setPrettyPrinting を実行する方法、既に存在するJSON 文字列から、整形する場合。文字列→整形した文字列 String json = "{\"a\":\"A\",\"b\":[10…

JSON path 指定して部分的にプリントする。

yipuran-gsonhelper/JSonValue.java at master · yipuran/yipuran-gsonhelper · GitHubを使用して、プリントする import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.yipuran.gsonhelper.JSonValue; try(InputStream in = new Fi…

フラットに属性が並んだオブジェクトから、階層のあるJSON への変換(3)

フラットに属性が並んだオブジェクトから、階層のあるJSON への変換(2) - Oboe吹きプログラマの黙示録 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ これは、1階層のグルーピングしかサポートしない。 もっと階層が深い場合は、同じ処理ロジックのシリアライザではだめだ。 そ…

フラットに属性が並んだオブジェクトから、階層のあるJSON への変換(2)

フラットに属性が並んだオブジェクトから、階層のあるJSON への変換(1)の続き。属性フィールドに、グルーピング名をアノテーションで付与することで、この処理を汎用的に行う シリアライザを考えた。 public class Sample{ public String title; @Groupin…

フラットに属性が並んだオブジェクトから、階層のあるJSON への変換(1)

フラットに属性が並んだオブジェクト → 階層構造オブジェクト → JSON という流れで処理するのは、階層構造オブジェクト の定義クラスを設計、配置するこのやり方は 非常にナンセンスと思う。 階層構造オブジェクト の定義クラスの存在無しで処理したい。Goog…

Gson の toJson と JsonWriter を併用する

Google gson の toJson と JsonWriter は、どちらか一方を使うことが多かった。 toJson(Object src, Type typeOfSrc) だけでなく、 toJson には、JsonWriter に結果を書き込むメソッドも用意されている。JsonWriter で書きながら、途中で任意のクラスオブジ…

@JsonAdapter >registerTypeAdapter

Google gson で、@JsonAdapter と、GsonBuilder の registerTypeAdapter で指定するアダプター どちらが優先されるか?@JsonAdapter が、優先される。 oboe2uran.hatenablog.com

gson のシリアライズ用アノテーション

@Expose GsonBuilder で、excludeFieldsWithoutExposeAnnotation() を指定すれば、 @Expose が付いたフィールドだけシリアライズする Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() .create(): @SerializedName フィールド名でなく…

Gson での Big JSON の出力

Google Gson の場合、大きなサイズの JSON を出力、gson の toJson では一度作成元 Object を持ってしまうので、 大きなサイズの JSON は toJsonでは不向きである。 大きなサイズのJSON を出力をする場合、JsonWriter を使う。例) OutputStream out = // TO…

Big JSON を読み込みを汎用化

先日の「Big JSON を読み込む JsonReader の実践」より汎用化を考えました。。 以下、抜粋のコードです。 public void execute(JsonReader reader, Consumer<T> consumer){ boolean request = false; try{ while((reader.hasNext() || reader.peek().equals(Jso</t>…

Big JSON を読み込む JsonReader の実践

先日書いた「Big JSON を読み込む JsonReader」、 より実践的なサンプルを書いてみる。 JSON素材 { "category": "JsonReader テスト", "filename": "sample.json", "itemlist":[ { "name": "A", "flag": true, "time": "2020/06/05 22:14:25" }, { "name": "…

Big JSON を読み込む JsonReader

大きなJSON を Google gson で読込むとき、メモリ不足にならないように、fromJson ではなく JSONのトークンで読みだす JsonReader を実行するのだが、注意しなければならない点がある。以下のように、JsonReader の hasNext() 問い合わせだけでは、END_ARRAY…

Google gson MalformedJsonException のパターン

Google gson で JSON読込みした時に発生する MalformedJsonException のパターンとは、以下の表にまとめることができる。 エラーのパターンは、これ以外あるかもしれないが、だいたいこんなところ。 例外のメッセージ エラーの意味 JSONエラーの例 Untermina…

MalformedException の捕捉処理を書き易くする。

Google gson の fromJson や JsonParser で発生する JSON書式エラー、MalformedException の捕捉を するとして、try~ctach 文の中に書いてもいいのですが、 1つのロジックで何回もJSON読込みの必要な処理があって、毎回 catch文の中で MalformedException …

Generic JsonDeserializer

先日、Gsonデシリアライザ ラムダで。 - Oboe吹きプログラマの黙示録 や、 Gsonデシリアライザ、汎用化? - Oboe吹きプログラマの黙示録 を書きましたが、 再考して、以下に至りました。 JsonDeserializer実装生成で目標のインスタンスの Supplier と JsonDe…

Gsonデシリアライザ ラムダで。

Gson のデシリアライザ、以下を用意すれば何でもリストをデシリアライズできる import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.function.Function; import com.google.gs…

Gsonデシリアライザ、汎用化?

久々に Google gson のデシリアライザを書いていて思いました。。 文字列のリスト、 import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.google.gson.JsonArray; import com.google…

GSON フィールド除外アノテーションを考えた。

Google gson には、@Expose というアノテーションを付与したフィールドだけを JSONシリアライズ対象に する機能があります。 でも逆に、特殊なアノテーションを付与してそのフィールドをシリアライズ対象外にする。 という機能がありません。 ほとんどが、ex…

JSON書式判定

書式として与える JSON または任意の JSON に対してその要素のキーを必須で持つかどうかを判定する処理を 普遍的に欲しくなりました。フォーマッタ―とまでは望まないけど、それに近い処理も、できれば充分です。 だって JSONを Object から JSON作成は、Goog…

jsTree JSON データの変換

ツリービューの情報を管理するのに、ノードの親子関係の処理を新たにコーディングするのは、どんな言語であれ 労力が必要です。 できれば、画面でツリーの描画操作の結果をそのまま管理するのが楽です。 せっかく JSON というオブジェクトで表現するのですか…

JSONのキーから、JsonElemnt 抽出を関数型インターフェースにする

JSONのキーから、JsonElement - Oboe吹きプログラマの黙示録 "." ドットで繋げたJSONのキーから JsonElement を抽出する これを更に、関数型インターフェースにする。Reader 、JsonElement 、JSON文字列、各々に対するパターンを 書いたが、JsonElement に対…

JSONのキーから、JsonElement

先日、JSONのキーを、GSONを使用してセパレータ "." ドットで繋げて値を取得するものを書いてみた。 oboe2uran.hatenablog.com でも、配列など JsonArray として取得して使用したい場合もあり要件が外れる時もある。 それに長ったらしいコードで気に要らない…

JSON のキーを指定して対象の値を取得

JSON → 任意のクラスオブジェクトに変換させることなく、 JSON のキーを指定して対象の値、valueを取得するものを汎用的なメソッドを用意しようと考えると 先日紹介した oboe2uran.hatenablog.com を超える機能のメソッドを作るのは難しい。 紹介した GitHub…

2つのJSONの差をラムダで処理する

Google gson の JsonParserを使用して 2つのJSONの差をラムダで処理するもの。 import java.io.Reader; import java.io.StringReader; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; import com.google.gson.Jso…

得体の知れない不明なJSON を GSON で解析する

キー名、値の型、ツリー構造が不明(定義を知らされてない)JSON を Google GSON でとりあえず認識させる。 このような要件定義はあり得ないけど、とにかく読み込ませてできる解析をする。 gson の JsonParser から取得する JsonElement を recursively なロ…

GSON の JsonArray を Stream で処理する

JsonArray は、Iterable実装だから、spliterator() より、StreamSupport で Stream 処理できる。json を読み込ませて JsonElement je = new JsonParser().parse(reader); if (je.isJsonArray()){ JsonArray jary = je.getAsJsonArray(); StreamSupport.strea…

Google gson Map null To empty String の入れ子

先日書いた MapSerializer oboe2uran.hatenablog.com入れ子でも、key : "" を適用させるには、、、registerTypeAdapter での登録に入れ子のパターンを書けばよい。 import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.go…

Google gson Map null To empty String

Google gson で、toJson をする時、null → "" になるように、 NullStringToEmptyAdapterFactory なるものを書いていた。 もしくは、どこかのライブラリには似たようなものがあってそれを使ったりしていたが、 でもこれでは、Map に対しては効かない、Map にK…