100% ローカル — データがブラウザの外に出ることはありません

JSONをJavaに変換|Jacksonがそのまま読めるrecordに

JSONのサンプルをJavaのrecordに変換します。型はボックス型になり、名前を変えた箇所には Jackson の注釈が付くので、届いたJSONをそのまま読み込めます。

高速 プライベート Cookieゼロ

JSON 入力

Java 出力

このツールの動作

JSON の標本が Java のレコードになります。オブジェクト一つにつき一つです。

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
public record Root(
    Long id,
    String firstName,
    Address address
) {}

public record Address(
    String city
) {}

レコードは、現代の Java で「データだけ」を表す最も短い書き方です。構築子、取得子、equals、hashCode、toString が付いてきます。Java 16 以降が要ります。

鍵は改名を生き延びる

部品名は Java の規則に従います。ハイフンは使えず、数字では始められず、予約語も使えません。content-type は contentType、class は class_、2fa は f2fa になります。名前を変えるたび、元の鍵が一緒について行きます。

import com.fasterxml.jackson.annotation.JsonProperty;

public record Root(
    @JsonProperty("content-type") String contentType,
    @JsonProperty("class") Long class_,
    Boolean ok
) {}

この注釈が無ければ、Jackson は contentType を探して何も見つけません。レコードは、自分が生まれた文書を読めなくなります。この文章を書くまで注釈は付いていませんでした。欠陥は直り、注釈は名前が実際に変わったところにだけ、取り込みとともに現れます。

箱型を使う理由

数値は Long か Double、真偽値は Boolean です。JSON には null があり、Java の基本型にはありません。null を受け取った double は 0.0 になります。本物の零と区別がつかない値です。箱型なら null を表せます。形式が許しているのはそちらです。

同じ理由で、null と型の分からない値は Object に、その配列は List<Object> になります。

標本が言えないこと

省略可能なものはなく、@Nullable も付きません。どの部品も、文書がそれを持っていたからそこにあります。レコードは表層では不変なので、後から「無いこともある」と決めた項目は、旗ではなく形の変更になります。

根が数値や文字列——42、"テキスト"——のときは拒みます。Java に型別名は無く、名前を付けるものが無いからです。オブジェクトの JSON 配列からは、その要素のレコードが得られます。実際に List<Root> に結びつけるのは、その形です。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

なぜ `long` や `double` ではなく `Long` と `Double` なのですか。
JSON の項目は null になりうるのに、基本型はなれないからです。`{"score": null}` を `double` に復号すると、ライブラリと設定次第で例外になるか、黙って 0.0 になります。箱型なら「無いこと」を表せます。その値が `List` に入るなら、総称型の側も箱型を求めます。
`@JsonProperty` はどこから来たのですか。
鍵が旅を生き延びないからです。`content-type` は部品名にできないので `contentType` になり、すると Jackson は JSON の中の `contentType` を探して何も見つけません。注釈が元の鍵を固定します。以前はこれが無く、レコードは出どころの文書を黙って読めなくなっていました。本物の欠陥で、直しました。
Jackson ではなく Gson を使っています。何が変わりますか。
注釈だけです。Gson は同じ位置に `@SerializedName("content-type")` を、JSON-B は `@JsonbProperty` を求めます。部品の名前も型もどちらでも同じなので、注釈とその取り込みを置換すれば、それで移せます。

関連ツール