できない.dev

JSONをパースするには

JSON 文字列やファイルを各言語のデータ構造へ変換する基本形を示す。
パース失敗の扱いと、型が保証されない点への向き合い方までを扱う。

公開:

Python

import json
 
with open("config.json", encoding="utf-8") as f:
    data = json.load(f)
 
print(data["name"])

ファイルから読むときは json.load、既に文字列になっているときは json.loads を使う。
encoding を明示するのは、既定値が環境依存で日本語が文字化けする事故を防ぐためである。

うまくいかない時: Python で「json.decoder.JSONDecodeError: Expecting value」が解消できない

JavaScript

import { readFile } from "node:fs/promises";
 
const raw = await readFile("config.json", "utf-8");
const data = JSON.parse(raw);
 
console.log(data.name);

JSON.parse は文字列だけを受け取るため、ファイルは先にテキストとして読み込む必要がある。
トップレベル await を使う場合はファイルが ESM として扱われている必要がある。

TypeScript

type Config = { name: string; port: number };
 
const raw = '{"name":"api","port":8080}';
const data = JSON.parse(raw) as Config;
 
console.log(data.port);

JSON.parse の戻り値は any なので、型注釈を付けても中身が検証されるわけではない。
外部から来る JSON を扱うなら as で断言せず、zod などで実行時に検証する方が安全である。

つまずき

パースに失敗するときは、まず入力が本当に JSON かを疑う。
HTTP レスポンスをそのまま渡した結果、エラーページの HTML をパースしようとしている例が多い。
末尾カンマやシングルクォートは JSON では許されない点も、設定ファイルを手書きしたときの定番の原因である。

型は信用しない

静的型付けの言語であっても、パース結果の型は宣言しただけでは保証されない。
外部 API や設定ファイルのように自分が生成していないデータは、キーの有無や値の型を実行時に検証してから使うのが安全である。