← ブログに戻る

よくあるJSONエラーと解決方法

JSONの一般的なエラー、デバッグ方法、修正テクニック。構文エラーから検証まで。

Big JSON Team12 分で読めますbeginner
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

12 分読む

# よくある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 使い方:
  • JSONを貼り付け
  • "Validate JSON" をクリック
  • エラーメッセージを確認
  • 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で一部修正
    • 手動確認が最も確実

    まとめ

    エラー予防

  • ✅ 良いエディタを使用(VS Code)
  • ✅ リアルタイム検証を有効化
  • ✅ フォーマッターを使用
  • ✅ スキーマ検証を実装
  • ✅ テストを書く
  • エラー発生時

  • 🔍 エラーメッセージを読む
  • 🔍 行番号と列番号を確認
  • 🔍 オンラインバリデーターを使用
  • 🔍 jqやPythonで検証
  • 🔍 必要に応じて手動修正
  • JSONエラーは避けられません。でも、適切なツールと知識があれば、すぐに解決できます!

    Share:

    関連記事

    Read in English