JEP 540:簡易 JSON API(インキュベーターへの登録完了)

2026/07/24 1:01

JEP 540:簡易 JSON API(インキュベーターへの登録完了)

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

jdk.incubator.json
API は、RFC 8259 に厳密に準拠する JSON の解析および生成のための、軽量な Java 組み込みソリューションを提供し、外部ライブラリの使用を不要とします。この新しい標準は、ストリーミングやデータバインディングなどの高度な機能よりも単純さ、堅牢性、使いやすさを優先することで、旧来の JEP 198 の提案に取って代わります。その設計思想は、
JsonValue
というシールドなインターフェースと、それ専用のサブインターフェース(例:
JsonString
JsonNumber
など)を中心に据えており、これにより開発者は面倒なダウンキャスト操作を行うことなくデータをアクセスできます。API は厳格な型変換および「early failure(fail-fast)」動作を強制し、無効な構造を即座に拒否できるようにしつつ、オプションメンバー向けの安全なメソッド
tryGet()
も提供します。インキュベイト・モジュールとしてこの機能はデフォルトで無効化されており、コンパイルおよび実行時に
--add-modules
フラグを使用して明示的に有効化する必要があります。現時点では
BigDecimal
などの複合型には対応していませんが、今後のアップデートでは損失のない精度の追加を目標としながら、その核心的な目標であるマシン対マシンの通信における厳密な準拠性を維持する予定です。

本文

JDK インキュベーター: JSON API (jdk.incubator.json)

要約

  • 標準的な API:外部ライブラリの依存関係を不要とし、JSON の解析と生成にシンプルで標準的な API を提供します。
  • 簡素な実装:少量のコードで多くの JSON 処理タスクを完了できます。
  • 実験的機能:本 API はインキュベーター(実験的)API です。

沿革

  • 2014 年発表の「軽量 JSON API」(JEP 198)の後継です。
  • 環境の変化に伴い、より異なるアプローチを採用しています。

目的と非目的

目的

  • RFC 8259 準拠:Java プラットフォーム上で、低コスト(簡略化された手順)で RFC 8259 に準拠する JSON ドキュメントを処理します。
  • シンプルさの維持:API は小さく、学習が容易であり、機械間通信に必要なデータ型と操作のみを提供します。
    • 解析設定の複数化や構文拡張、データバインド(結合)、ストリーミングなどの機能は含まれません
  • 探索的プログラミング:明確なエラーメッセージと共に素早く失敗するメソッドを提供し、不慣れな JSON ドキュメントへの迅速な探索を可能にします。
    • コードは事実上のスキーマとして機能し、構造の進化に対してレジリエント(回復力)です。
  • JDK 内蔵能力:JDK が標準的に JSON を解析・生成できる能力を持ちます。

非目的

  • 確立された外部 JSON ライブラリの置換ではありません。

動機

JSON は現代コンピューティングで不可欠ですが、Java エコシステムには Jackson や Gson など多様なライブラリが存在します。しかし、「JSON ドキュメントから一部のデータを抽出する」という単純なタスクにおいて、Java コードも Python や Go のようにシンプルであるべきです。

  • 最近の進化への貢献:コレクション用のファクトリーメソッドや
    var
    宣言などと同様、単純なタスクを実現しやすくすることを目標としています。
  • 設定ファイルとしての JSON:JDK は現在プロパティ形式を設定ファイルに使用していますが、構造化データ(アレイ)の表現には工夫が必要でした。JSON を組み込むと、以下のように自然なアレイ表現が可能になります。
// プロパティ形式の限界(巧妙な回避策が必要)
security.provider.1=SUN
security.provider.2=SunRsaSign
security.provider.3=SunEC

// JSON の利点(自然な表現)
{
  "providers": [ "SUN", "SunRsaSign", "SunEC" ],
  ...
}

概要

jdk.incubator.json
API は、JSON 値を表す
JsonValue
インターフェースを核としています。

JSON のプリミティブタイプ

  1. 文字列
    "Hello"
  2. 数値:基数 10 の十進数字(例:
    6
    ,
    2.9E+5
  3. ブール値
    true
    /
    false
  4. null
    null

JSON の構造体タイプ

  1. オブジェクト
    { }
    で囲まれ、メンバー(鍵と値)の集合です。
  2. アレイ
    [ ]
    で囲まれ、JSON 値の順序付きリストです。

これらに対応する

JsonValue
のサブインターフェースは以下の 6 つです:

  • JsonString
    ,
    JsonNumber
    ,
    JsonBoolean
    ,
    JsonNull
    (プリミティブ)
  • JsonObject
    ,
    JsonArray
    (構造体)

JsonValue
は**シールドされた(sealed)**ため、型スイッチ文のデフォルト処理が必須となります。

解析と生成の実例

解析(抽出)

米国国家気象庁 API のレスポンスから予報気温の平均を計算する例:

String body = ... REST レスポンシボディ(JSON ドキュメント)... ;
JsonValue json = Json.parse(body);
json.get("properties").get("periods").asList().stream()
    .mapToInt(j -> j.get("temperature").asInt())
    .average()
    .ifPresent(IO::println);

生成(出力)

JSON ドキュメントを生成する例:

IO.println(JsonObject.of(Map.of("providers",
                                JsonArray.of(List.of(
                                    JsonString.of("SUN"),
                                    JsonString.of("SunRsaSign"),
                                    JsonString.of("SunEC")
                                )))));

出力:

{"providers":["SUN","SunRsaSign","SunEC"]}

JSON ドキュメントの解析とナビゲーション

Json.parse(...)
メソッドを呼び出すだけで、JSON ドキュメント(文字列や
char[]
)が名前付きツリーとして返されます。

  • 厳格な解析:RFC 8259 に準拠し、末尾のカンマやコメントなどの構文拡張はサポートされません。重複するメンバー名もエラーとします。
  • 例外: 解析失敗時は
    unchecked JsonParseException
    をスローします(エラー詳細と位置情報付き)。
  • アクセスメソッド:
    • get(String)
      : メンバー値を取得(型キャスト不要)。
    • get(int)
      : アレイ要素を取得。

不適切なタイプや存在しないメンバーへのアクセスは

JsonValueException
をスローします。

JSON 値を Java 値への変換

JSON 値を適切な Java プリミティブ型またはコレクションに変換するには、対応するメソッドを使用します。

サブタイプメソッド生成される Java 型
JsonString
asString()
String
JsonNumber
asInt()
/
asLong()
/
asDouble()
int
/
long
/
double
JsonBoolean
asBoolean()
boolean
JsonObject
asMap()
java.util.Map
JsonArray
asList()
java.util.List

特徴

  • 変換メソッドにより、多くの場合
    instanceof
    チェックやダウンキャストが不要になります。
  • 数値の精度や範囲によっては例外をスローします(例:整数表現不可能な小数は失敗)。
  • JsonNull
    には直接の変換メソッドはありません(
    tryValue
    を使用)。

JSON ドキュメントの進化への対処

オプションメンバーの処理

特定のメンバーが存在しない可能性を考慮する場合は、

tryGet()
メソッドを使用します。

  • 存在する場合:
    Optional<JsonValue>
    を返す。
  • 不存在の場合: 空の
    Optional
    を返す(例外はスローしない)。

null 値の処理

値が

JsonNull
か否かを区別する場合は、
tryValue()
メソッドを使用します。

  • JsonNull
    の場合: 空の
    Optional
    を返す。
  • それ以外の場合: その値を返す。

可変な構造の処理

異なる JDK バージョン間や時間経過で JSON 形式が変化する場合(例:スレッド ID が文字列から数値へ変更)に対応します。型スイッチ文を使用することで柔軟に処理できます。

long tid = switch (thread.get("tid")) {
    case JsonNumber jn -> jn.asLong();
    case JsonString js -> Long.parseLong(js.asString());
    default -> throw new JsonValueException("Unexpected type for \"tid\"");
};

JSON ドキュメントの生成

JsonValue
toString()
メソッドを呼び出すことで、コンパクトな JSON 文字列を取得できます。

  • toString()
    : コンパクト形式(改行なし)。
  • Json.toDisplayString(json, indent)
    : 漂亮(pretty-printed)形式(改行付き・インデントあり)。
    • 生成された出力は再び解析可能です。

JSON 数値

JSON 数値の精度と範囲に関する扱い:

  • asDouble()
    : IEEE 754 64 ビット浮動小数点に変換します(無限大や NaN は返しません)。
  • asInt()
    /
    asLong()
    : 正確に表現できる場合にのみ変換されます。
    • 範囲外または非整数の場合、
      JsonValueException
      をスローします。
  • 高精度データの保存: 精度を失わずに処理したい場合は
    java.math.BigDecimal
    に直接変換します。

代替案について検討されなかった理由

  1. 完全な機能セットの提供:データバインドやストリーミングは API の大きさを増やし保守コストが高くなるため、排除されました。
  2. 外部 JSON ライブラリの統合:ライセンス・ガバナンス上の課題と相互運用性の緊張から除外されました。
  3. 「何もしない」方針:単純なタスクの実装を容易にし、外部依存性を排除するため、標準 API の導入が適切です。
  4. 重複メンバー名の許可:RFC 8259 に準拠し、曖昧さを避けるため厳格にエラーとしました。
  5. 構文拡張のサポート(例:JSON5):相互運用性とテストコストの観点からサポートしません。

テスト

  • RFC 8259 の canonical forms に対する厳格なテストを実装しています。
  • 外部の JSON 解析テストスイートを活用し、互換性を確保します。

リスクと仮定

  • メモリ要件: JSON ドキュメント全体をメモリ上の文字列として保持するため、超大規模なドキュメントは処理できません(ミニマル設計のため)。
  • 既存アプリケーションとの整合性: 既に外部ライブラリを使用しているアプリケーションとの競合可能性がありますが、長期的には標準化により利便性が向上します。
  • 機能の拡張: インキュベーション期間中、データバインドやストリーミングが必要なユースケースが増えた場合は、それらへの対応を検討する予定です。

付録:天気予報の実装例

以下のコマンドで実行すると、カリフォルニア州サンタクララの 7 日間予報の平均気温が出力されます。

$ java --add-modules jdk.incubator.json Weather.java

出力:

WARNING: Using incubator modules: jdk.incubator.json
53.357142857142854

インキュベーター API の有効化

現在、JSON API はデフォルトで無効です。使用するには以下のようにモジュールを明示的に追加する必要があります。

コンパイルと実行

$ javac --add-modules jdk.incubator.json Weather.java
$ java --add-modules jdk.incubator.json Weather

JShell での利用

$ jshell --add-modules jdk.incubator.json
jshell> import jdk.incubator.json.*
jshell> Json.parse("""{"name": "Today", "temperature": 54}""")
$2 ==> {"name":"Today","temperature":54}
jshell> $2.get("temperature").asInt()
$3 ==> 54

同じ日のほかのニュース

一覧に戻る →

2026/07/23 23:24

筆記は脳にとっても有益です

## Japanese Translation: 筆記は、抽象的なアイデアを複雑な身体的動きと統合させることで、タイピングよりも脳をより深く関わらせます。著者は、*Baroque Cycle* のために大量のページを書くなど、25 年間の日常的な筆記の経験に基づいてこの主張を支持しています。「書き手痙攣」という一般的な恐怖とは対照的に、著者は数十年の実践を通じてこれを一度も経験したことがありませんが、文字が illegible になるや大文字を忘れるなどの初期の苦労は新しい書き手によくあると認められています。筆記機構では適度な摩擦(「歯車」)に依存しており、草書はこの摩擦を活用することで、個々の文字を書くことよりも疲れにくくしています。「インク災害」という一般的な恐怖は、 Fountain Pen との固有の欠陥ではなく、不適切な材料や条件(例えば大気圧の変化など)から生じた神話であることが多く、適切な紙とペンとの組み合わせにより左利きであっても滲みを防ぐことができます。教育者は AI の懸念により学生を長手筆記試験に戻すようになり、学習者が高価な機器への投資をする前に、綿成分の紙や Pilot G-2 ペンのような利用可能な選択肢を試験することが重要となっています。タイピングや AI だけに依存するだけでは、運動技能を統合する身体的評価に備えられない可能性があります。

2026/07/24 4:26

Show HN: Echo – オープンウェイトモデルで費用を 1/3 に抑えつつファブルレベルの成果を実現

## Japanese Translation: 本記事では、OpenRouter、Fireworks、JusCode、Pellmell.ai、TracerML(Echo)、SakanaAI Fugu、Magnitude.dev などの現代の AI ルーティングシステムが、Fable といったプレミアムまたは専用ソリューションと比較して著しく低いコストで高品質な大規模言語モデル(LLM)の出力を可能にすることを論じています。ベンチマークデータによれば、ルーターは HumanEval+、SWE-bench Verified、BigCodeBench を含む 7 つのベンチマークファミリーにおいてトップクラスモデルと同等のパフォーマンスを発揮しており、従来手法のおよそ 1/3 の価格で達成されています。生成に基づいたアプローチ(例:Fusion)のように多数の返信を生成して合成する過程で高いレイテンシーとコストを招く一方で、ルーティングアーキテクチャは速度を維持しつつ結果を改善します。Dogpile.com、AskJeeves、Alta Vista、Lycos、DeepSeek R2、GitHub Copilot(GHCP)、OpenAI の「auto」モードといった製品も、異なる戦略を示しています。OpenAI の「auto」モードは単純なクエリに対するインフラコスト削減のためモデルサイズを選択し、Pellmell はルーターを通じて最適の返信を即時にストリーミングするとともに、必要に応じて絵文字反応を使って合成を行います。エコシステムは歴史的な検索エンジンから GPT-5/4o/o1、Qwen 3.7 Max、Anthropic モデル、GPT Sol、そしてさまざまなオープンウェイトの中国モデルを使用する現代ツールまでをカバーしています。重要な技術的な区別として、現在の LLM の専門家混合物(MoE)におけるルーティング決定はトークン単位で行われるのに対し、タスク固有またはアンサンブルルーティングとはアーキテクチャ的に異なります。プライバシーポリシーは更新され、Echo が顧客のプロンプト、ファイル、チャット、出力をモデルの学習やファインチューニングに使用しないことが明確に記載されています。また、Echo は今後は無料での初期クレジットを提供し、サインアップ時にクレジットカードの登録が不要となっています。専門家は、月 200 ドルといった優遇されたサブスクリプションプランが一時的な損失誘発策であり、エンタープライズは最終的にトークンあたり標準的な API 価格に直面する可能性があると警告しています。「1/3 のコストで Fable 相当の結果」といった主張に対する懐疑については、ルーターが高品質モデル(Fable など)を必要に応じてのみ使用することで費用を節約するためであることを明確化することで対処します。これらの進展は、業界がよりアクセス可能なインフラストラクチャーへと移行するにつれて、企業が品質、速度、価格を慎重にバランスさせることを迫っています。

2026/07/24 6:05

Namecheap が単に依頼されたからといって、私のアカウントを未確認の第三者に引き渡した

## Japanese Translation: CVC Capital パートナーズによる 2025 年 9 月の買収およびそれ以降の経営陣の変更を経て、Namecheap は深刻なユーザー信頼危機に直面しており、その要因は重大なセキュリティ上の見落としと運用上の不安定さにある。具体的な不満事項には、正当な理由なく WHOIS データが準拠しているにもかかわらずアカウントがロックされること、Link などのサードパーティ系決済プロセッサーへの強制的な移行(これらは侵襲的な SMS 認証を要求する)が含まれる。さらに、攻撃者に対しソーシャルエンジニアリングを用いて完全なドメイン制御権を付与したという致命的なサポートインシデントが発生しており、これは無料で利用可能なプライバシーツールが提供できたはずの保護を回避するという事案である。これらの問題は、私募資金出資(プライベートエクイティ)による所有下でのコスト削減が本質的なセキュリティ慣行を犠牲にすることで生じる「enshittification」の傾向を象徴している。その結果、ユーザーは Cloudflare、Porkbun、Gandi といった低価格かつより安全な代替手段へ急激に移りつつあり、これは従来の高マージン型のドメインレジスターからの市場シフトではなく、堅牢なセキュリティを優先するレジスターへの転換を示している。 ## Text to translate: Following its September 2025 acquisition by CVC Capital Partners and subsequent leadership changes, Namecheap is facing a critical crisis of user trust due to severe security lapses and operational instability. Specific grievances include accounts being locked without valid reason despite compliant WHOIS data, forced migration to third-party payment processors like Link that demand invasive SMS verification, and catastrophic support incidents where agents granted attackers full domain control through social engineering—bypassing protections that free privacy tools could have provided. These issues exemplify the "enshittification" trend where cost-cutting under private equity ownership sacrifices essential security practices. Consequently, users are rapidly migrating to cheaper, more secure alternatives like Cloudflare, Porkbun, and Gandi, signaling a market shift away from traditional high-markup registrars toward those prioritizing robust security.