Error: Unexpected end of JSON input の解決方法

Error: Unexpected end of JSON input の解決方法

このエラーは、JSONデータを解析する際にデータが不完全である場合に発生します。主にデータの取得やパースの処理で発生するこのエラーの原因と解決方法について解説します。

エラーの発生条件

  • JSONデータが不完全な場合
  • 空のレスポンスをパースしようとした場合
  • JSON形式ではないデータをパースしようとした場合
  • サーバーやネットワークエラーでデータが破損している場合

原因1: サーバーからのレスポンスが空

サーバーが空のレスポンスを返すと、JSON.parseはエラーをスローします。

解決方法1: レスポンスデータの検証

JSON.parseを使用する前にデータを検証します。

fetch('/api/data')
  .then(response => response.text())
  .then(data => {
    if (data.trim() === '') {
      throw new Error('レスポンスが空です');
    }
    return JSON.parse(data);
  })
  .catch(error => console.error(error));

原因2: 不正なJSONデータ

サーバーが返すJSONデータが正しい形式になっていない場合、エラーが発生します。

解決方法2: JSONデータの形式を確認

レスポンスデータを確認し、不正なJSON形式がないか検証します。

const jsonString = '{"key": "value"'; // 不完全なJSON
try {
  const jsonData = JSON.parse(jsonString);
} catch (error) {
  console.error('JSONが不正です:', error.message);
}

原因3: サーバーサイドの問題

サーバー側でエラーが発生し、不完全なデータが返される場合があります。

解決方法3: サーバーのログを確認

サーバー側のレスポンスをデバッグし、正しいJSONデータを返すよう修正します。

// サーバー側 (Node.js)
app.get('/api/data', (req, res) => {
  try {
    const data = { key: 'value' };
    res.json(data);
  } catch (error) {
    res.status(500).send('エラーが発生しました');
  }
});

原因4: ネットワークエラー

ネットワークの問題でデータが正しく取得できない場合に発生します。

解決方法4: ネットワークエラーのハンドリング

fetchやaxiosでエラーハンドリングを実装します。

fetch('/api/data')
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTPエラー: ${response.status}`);
    }
    return response.json();
  })
  .catch(error => console.error('ネットワークエラー:', error.message));

原因5: JSON.parseの不適切な使用

JSON.parseを直接使用する際に、適切な検証を行わない場合に発生します。

解決方法5: JSON.parseの安全な使用

JSON.parseを使用する前に入力を検証します。

function safeParse(jsonString) {
  try {
    return JSON.parse(jsonString);
  } catch {
    console.error('不正なJSON文字列');
    return null;
  }
}

原因6: JSONレスポンスがPromiseとして扱われていない

fetchやaxiosでJSONレスポンスを正しく処理しない場合に発生します。

解決方法6: JSONレスポンスを適切に処理

Promiseチェーンを適切に構築します。

fetch('/api/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('エラー:', error));

原因7: クライアントサイドのバグ

フロントエンドでデータ処理が正しくない場合にエラーが発生します。

解決方法7: デバッグツールを活用

ブラウザの開発者ツールを使用してデータを検証します。

原因8: サードパーティAPIのレスポンスエラー

外部APIが不正なレスポンスを返す場合があります。

解決方法8: APIレスポンスを検証

外部APIのレスポンスを検証し、データを安全に処理します。

axios.get('https://api.example.com/data')
  .then(response => {
    if (typeof response.data !== 'object') {
      throw new Error('不正なレスポンス形式');
    }
    console.log(response.data);
  })
  .catch(error => console.error('APIエラー:', error));

原因9: JSONのエンコードミス

データが正しくエンコードされていない場合に発生します。

解決方法9: エンコード設定の確認

サーバーやクライアントのエンコード設定を確認します。

原因10: nullやundefinedのデータをパース

nullやundefinedのデータをパースしようとするとエラーが発生します。

解決方法10: nullチェックを実装

データを処理する前にnullチェックを行います。

const jsonData = null;
if (jsonData) {
  console.log(JSON.parse(jsonData));
} else {
  console.error('データが空です');
}

原因11: JSONのエスケープ文字が不正

不正なエスケープ文字が含まれるとエラーが発生します。

解決方法11: エスケープ文字を正しく処理

特殊文字をエスケープします。

const jsonString = '{"key": "value with \\"escaped\\" quotes"}';
const jsonData = JSON.parse(jsonString);
console.log(jsonData);

まとめ

「Error: Unexpected end of JSON input」は、主にデータの不完全性や処理ミスによって発生します。各原因を特定し、適切な処理を行うことでエラーを防ぐことが可能です。