JavaScript で文字列が有効な JSON 文字列かどうかをチェックする

Tahseen Tauseef 2023年10月12日
  1. JSON オブジェクトと Javascript オブジェクトの違い
  2. JavaScript で JSON 文字列の有効性を確認する
JavaScript で文字列が有効な JSON 文字列かどうかをチェックする

この記事では、JavaScript で try...catch を使用せずに、特定の文字列が有効な JSON または JavaScript ObjectNotation 文字列であるかどうかを確認する方法について説明します。JSON 文字列の定義と、それがワークフローを容易にするのにどのように役立つかから始めましょう。

JSON は、XML と非常によく似たデータの構造化に使用される言語に依存しないテキスト形式です。文字列、数値 int、float など、ブール値、配列、または中括弧で囲まれた Java オブジェクト(キーと値のペア)で構成できます。

JSON オブジェクトと Javascript オブジェクトの違い

JavaScript のオブジェクトは次のようになります。

object = {
  name: 'Haseeb',
  age: 31,
  city: 'New York',
  male: true
}

そのオブジェクトを JSON 形式で保存すると、次のようになります。

{"name":" Haseeb ", "age":31, "city":"New York", "male":true}

オブジェクトをテキストファイルから取得すると、JSON 文字列形式に変換されます。

{ 'name': ' Haseeb ', 'age': 31, 'city': 'New York', 'male': true }

JSON 形式が人間が読める形式であり、言語が操作しやすいことがわかります。

それ以外にもさまざまな利点があります。JSON は、読み取りと書き込みが簡単であるだけでなく、すべての言語と統合でき、詳細な構造により、解析を便利に使用できるようになりました。

JSON は、主にサーバーと Web またはモバイルアプリケーション間でデータを転送したり、その逆を行ったりするために使用されるため、アプリケーションプログラミングインターフェイス(API)で一般的に使用されます。

JSON の解析関数を使用することで、JSON 文字列からオブジェクトを作成できるようになりました。その方法の例を次に示します。

string = '{"name":"John", "age":31, "city":"New York", "male":true}';
object = JSON.parse(string);
console.log(object);

出力:

{ 
    name: 'John', 
    age: 31, 
    city: 'New York', 
    male: true 
}

予想どおり、解析関数はすべてをオブジェクトのキーと値(JSON オブジェクト)にトリミングします。これが、JSON 文字列がシステム間でデータを転送するための規則になっている理由です。

JavaScript で JSON 文字列の有効性を確認する

try...catch は、プログラムの実行を停止せずに、指定された JSON 文字列にポップアップする可能性のある潜在的なエラーを処理するために使用されます。文字列の構文に誤りがあるか、パラメータが欠落しているか、または分割引数が間違っている可能性があります。

try...catch を使用して JSON 文字列の有効性を確認する方法は次のとおりです。

try {
  object = JSON.parse(json);
} catch (error) {
  is_json = false;
  console.log('Invalid JSON string');
}

コードに次の文字列を付けてみましょう。

json = '{"name":"John","city""New York"}';

出力:

Invalid JSON string

ご覧のとおり、try...catch では、文字列の何が問題になっているのかはわかりません。それは単に問題があることを示しています。

JSON 文字列の何が問題になっているのかを理解するために、try...catch を使用せずに文字列に表示されるエラーをすべてではないにしても検出する、カスタムメイドの関数を使用する場合があります。

isJSON = function(json) {
  // Nested Count function only to be used for counting colons and commas
  countCharacter =
      function(string, character) {
    count = 0;
    for (var i = 0; i < string.length; i++) {
      if (string.charAt(i) == character) {  // counting : or ,
        count++;
      }
    }
    return count;
  }

  json = json.trim();  // remove whitespace, start and end spaces

  // check starting and ending brackets
  if (json.charAt(0) != '{' || json.charAt(json.length - 1) != '}') {
    console.log('Brackets {} are not balanced')
    return false
  }
  // else this line will check whether commas(,) are one less than colon(:)
  else if (!(countCharacter(json, ':') - 1 == countCharacter(json, ','))) {
    console.log('comma or colon are not balanced');
    return false;

  } else {
    json = json.substring(1, json.length - 1);  // remove first and last
                                                // brackets
    json = json.split(',');  // split string into array, and on each index there
                             // is a key-value pair

    // this line iterate the array of key-value pair and check whether key-value
    // string has colon in between
    for (var i = 0; i < json.length; i++) {
      pairs = json[i];

      if (pairs.indexOf(':') == -1) {  // if colon not exist in b/w

        console.log('No colon b/w key and value');
        return false;
      }
    }
  }
  return true;
};

2つの JSON 文字列を使用して、それらの欠点を見つけましょう。

json = ' {"name":"John","city""New York"} ';
json2 = ' {"name":"John","city":"New York" ';

出力:

comma or colon are not balanced
false
Brackets {}
are not balanced
false

このコードは、一部の誤ったケースに当てはまるため弱いため、上位関数と try...catch コードの両方をマージして、デバッグで絶対的な答えを得るハイブリッドアプローチを見つけます。

isJSON = function(json) {
  is_json = true;  // true at first

  // Try-catch and JSON.parse function is used here.

  try {
    object = JSON.parse(json);
  } catch (error) {
    is_json = false;
    console.log('might be a problem in key or value\'s data type');
  }

  if (!is_json) {
    countCharacter =
        function(string, character) {
      count = 0;
      for (var i = 0; i < string.length; i++) {
        if (string.charAt(i) == character) {  // counting : or ,
          count++;
        }
      }
      return count;
    }

    json = json.trim();  // remove whitespace, start and end spaces

    if (json.charAt(0) != '{' || json.charAt(json.length - 1) != '}') {
      console.log('Brackets {} are not balanced')

    }

    else if (!(countCharacter(json, ':') - 1 == countCharacter(json, ','))) {
      console.log('comma or colon are not balanced');

    } else {
      json =
          json.substring(1, json.length - 1);  // remove first and last brackets
      json = json.split(',');


      for (var i = 0; i < json.length; i++) {
        pairs = json[i];
        if (pairs.indexOf(':') == -1) {  // if colon not exist in b/w
          console.log('No colon b/w key and value');
        }
      }
    }
  }
  return is_json;
};
json = ' {"name":"John", "birth":"1986-12-14", "city":5a0} ';

出力:

might be a problem in key or value's data type
false

この関数には前の関数と同じデバッグレベルが与えられますが、今回は絶対的な答えになります。

関連記事 - JavaScript JSON