よくあるJSONエラーと解決方法
JSONの一般的なエラー、デバッグ方法、修正テクニック。構文エラーから検証まで。
Big JSON Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# よくあるJSONエラーと解決方法
JSONの一般的なエラーとその解決方法を学びます。
1. カンマ関連のエラー
カンマの欠落
❌ エラー:
{
"name": "田中太郎"
"age": 30
}
✅ 修正:
{
"name": "田中太郎",
"age": 30
}
末尾のカンマ
❌ エラー:
{
"name": "田中太郎",
"age": 30,
}
✅ 修正:
{
"name": "田中太郎",
"age": 30
}
注意: JavaScriptは末尾カンマを許可しますが、JSONは許可しません。
配列の末尾カンマ
❌ エラー:
{
"colors": ["赤", "青", "緑",]
}
✅ 修正:
{
"colors": ["赤", "青", "緑"]
}
2. 引用符のエラー
シングルクォート
❌ エラー:
{
'name': '田中太郎',
'age': 30
}
✅ 修正:
{
"name": "田中太郎",
"age": 30
}
ルール: JSONはダブルクォート(")のみ許可。
キーの引用符なし
❌ エラー:
{
name: "田中太郎",
age: 30
}
✅ 修正:
{
"name": "田中太郎",
"age": 30
}
エスケープ忘れ
❌ エラー:
{
"message": "彼は"こんにちは"と言った"
}
✅ 修正:
{
"message": "彼は\"こんにちは\"と言った"
}
3. 括弧の問題
括弧の不一致
❌ エラー:
{
"user": {
"name": "田中太郎",
"age": 30
}
✅ 修正:
{
"user": {
"name": "田中太郎",
"age": 30
}
}
配列括弧の不一致
❌ エラー:
{
"colors": ["赤", "青", "緑"
}
✅ 修正:
{
"colors": ["赤", "青", "緑"]
}
4. データ型のエラー
数値の誤った形式
❌ エラー:
{
"age": 030,
"price": .99,
"total": 100.
}
✅ 修正:
{
"age": 30,
"price": 0.99,
"total": 100.0
}
NaN、Infinity
❌ エラー:
{
"value": NaN,
"max": Infinity
}
✅ 修正:
{
"value": null,
"max": 999999
}
または
{
"value": "NaN",
"max": "Infinity"
}
undefinedの使用
❌ エラー:
{
"name": "田中太郎",
"email": undefined
}
✅ 修正:
{
"name": "田中太郎",
"email": null
}
または省略:
{
"name": "田中太郎"
}
5. コメントのエラー
コメントの使用
❌ エラー:
{
// これはコメント
"name": "田中太郎",
/ 複数行
コメント /
"age": 30
}
✅ 修正:
{
"name": "田中太郎",
"age": 30
}
注意: 純粋なJSONはコメントをサポートしません。JSON5やJSONCを使用するか、削除してください。
6. エンコーディングの問題
BOM (Byte Order Mark)
問題: ファイルの先頭に見えない文字 検出:# ファイルの最初のバイトを確認
xxd -l 3 file.json
修正:
# BOMを削除
sed -i '1s/^\xEF\xBB\xBF//' file.json
文字エンコーディング
❌ 問題:
- Latin-1でエンコードされたUTF-8文字
- 不正なUTF-8シーケンス
✅ 修正:
import json
# UTF-8で読み込み
with open('file.json', 'r', encoding='utf-8') as f:
data = json.load(f)
7. 改行とホワイトスペース
不正な改行
❌ エラー:
{
"message": "これは
複数行のテキスト"
}
✅ 修正:
{
"message": "これは\n複数行のテキスト"
}
または
{
"message": "これは複数行のテキスト"
}
不正な制御文字
❌ エラー: タブや改行が文字列に直接含まれる
✅ 修正:
{
"text": "行1\n行2\tタブ"
}
8. 構造のエラー
重複するキー
❌ 問題:
{
"name": "田中太郎",
"age": 30,
"name": "佐藤花子"
}
結果: 最後の値が使用される(実装依存)
✅ 修正: キーを一意に
{
"firstName": "田中太郎",
"age": 30,
"lastName": "佐藤花子"
}
ルートが配列またはオブジェクトでない
❌ エラー:
"これは単なる文字列"
✅ 修正:
{
"message": "これは単なる文字列"
}
注意: 一部のパーサーは許可しますが、ベストプラクティスではありません。
デバッグツール
1. オンラインバリデーター
JSONLint
URL: jsonlint.com 使い方:BigJSON.online
- リアルタイム検証
- エラー箇所のハイライト
- 自動フォーマット
2. コマンドライン
jq
# 検証
jq '.' file.json
# エラーがあれば詳細表示
jq '.' file.json 2>&1 | grep error
Python
python -m json.tool file.json
エラー例:
Expecting property name enclosed in double quotes: line 3 column 3 (char 25)
Node.js
node -e "JSON.parse(require('fs').readFileSync('file.json', 'utf8'))"
3. プログラム内
JavaScript
try {
const data = JSON.parse(jsonString);
console.log('有効なJSON');
} catch (error) {
console.error('JSONエラー:', error.message);
// "Unexpected token } in JSON at position 45"
}
Python
import json
try:
data = json.loads(json_string)
print('有効なJSON')
except json.JSONDecodeError as e:
print(f'JSONエラー: {e}')
print(f'行: {e.lineno}, 列: {e.colno}')
print(f'位置: {e.pos}')
エラーメッセージの読み方
JavaScript
SyntaxError: Unexpected token } in JSON at position 45
意味:
- 位置45に予期しない
} - 括弧の不一致の可能性
Python
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 3 column 20 (char 45)
意味:
- 3行目、20列目
- カンマが必要
自動修正
jq (限定的)
# フォーマットするだけ(エラーは修正しない)
jq '.' file.json > formatted.json
Prettier
# フォーマット(一部のエラーを修正)
npx prettier --write file.json
カスタムスクリプト
function fixCommonErrors(jsonString) {
// 末尾のカンマを削除
jsonString = jsonString.replace(/,(\s[}\]])/g, '$1');
// シングルクォートをダブルクォートに
jsonString = jsonString.replace(/'/g, '"');
// コメントを削除
jsonString = jsonString.replace(/\/\/.$/gm, '');
jsonString = jsonString.replace(/\/\[\s\S]?\\//g, '');
return jsonString;
}
検証のベストプラクティス
1. スキーマ検証
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number", "minimum": 0 }
},
"required": ["name"]
}
const Ajv = require('ajv');
const ajv = new Ajv();
const schema = {...};
const validate = ajv.compile(schema);
const data = { name: "田中太郎", age: 30 };
const valid = validate(data);
if (!valid) {
console.log(validate.errors);
}
2. リアルタイム検証
VS Code
settings.json:
{
"json.validate.enable": true,
"json.schemas": [
{
"fileMatch": [".json"],
"url": "./schema.json"
}
]
}
3. プリコミットフック
#!/bin/bash
# .git/hooks/pre-commit
for file in $(git diff --cached --name-only | grep '.json$'); do
if ! jq '.' "$file" > /dev/null 2>&1; then
echo "エラー: $file は無効なJSON"
exit 1
fi
done
予防策
1. エディタ設定
{
"editor.formatOnSave": true,
"editor.formatOnPaste": true,
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
2. Linter使用
ESLint設定
{
"extends": ["plugin:json/recommended"]
}
3. 型安全な生成
// TypeScriptで型安全
interface User {
name: string;
age: number;
}
const user: User = {
name: "田中太郎",
age: 30
};
const json = JSON.stringify(user);
4. テスト
describe('JSON Validation', () => {
it('should be valid JSON', () => {
const json = fs.readFileSync('data.json', 'utf8');
expect(() => JSON.parse(json)).not.toThrow();
});
});
トラブルシューティング チェックリスト
- [ ] すべての文字列にダブルクォート(")を使用
- [ ] すべてのキーに引用符
- [ ] 末尾のカンマなし
- [ ] 括弧の対応
- [ ] 有効なデータ型のみ(文字列、数値、boolean、null、配列、オブジェクト)
- [ ] コメントなし
- [ ] 正しいエスケープ
- [ ] UTF-8エンコーディング
- [ ] BOMなし
- [ ] 有効な数値形式
よくある質問
Q: JSONLintでエラーが出ないのに、コードでパースできません
A: 確認事項:- 文字エンコーディング(UTF-8)
- BOMの有無
- 特殊文字のエスケープ
- 数値の範囲
Q: 大きなJSONファイルのエラーを見つけるには?
A:- バイナリサーチでファイルを分割
- jqで部分的にパース
- JSONストリーミングパーサー使用
Q: 自動的にエラーを修正できますか?
A:- 限定的に可能
- Prettierで一部修正
- 手動確認が最も確実
まとめ
エラー予防
エラー発生時
JSONエラーは避けられません。でも、適切なツールと知識があれば、すぐに解決できます!