web-dev-qa-db-ja.com

値がjsonオブジェクトかどうかを確認するにはどうすればよいですか?

私のサーバー側のコードは、成功するとjsonオブジェクト、失敗すると文字列「false」である値を返します。返された値がjsonオブジェクトであるかどうかを確認するにはどうすればよいですか?

97
bart

jQuery.parseJSON()は、文字列がJSONである場合、タイプ「オブジェクト」のオブジェクトを返す必要があるため、typeofでタイプを確認するだけで済みます。

var response=jQuery.parseJSON('response from server');
if(typeof response =='object')
{
  // It is JSON
}
else
{
  if(response ===false)
  {
     // the response was a string "false", parseJSON will convert it to boolean false
  }
  else
  {
    // the response was something else
  }
}
97
Dr.Molle

選択したソリューション は私にとってはうまくいきません

     "Unexpected Token <" 

chromeのエラー。これは、解析が不明な文字に遭遇するとすぐにエラーがスローされるためです。ただし、ajaxを介して文字列値のみを返す場合、これを回避する方法があります(PHPまたはASPXを使用してajaxリクエストを処理し、条件に応じてJSONを返す場合と返さない場合に非常に役立ちます) )

解決策は非常に簡単です。有効なJSONリターンであるかどうかを確認するには、以下を実行できます

       var IS_JSON = true;
       try
       {
               var json = $.parseJSON(msg);
       }
       catch(err)
       {
               IS_JSON = false;
       }                

前にも言ったように、これはAJAXリクエストから文字列型のものを返す場合、または混合型を返す場合の解決策です。

144
Serguei Fedorov

解決策3(最速の方法)

/**
 * @param Object
 * @returns boolean
 */
function isJSON (something) {
    if (typeof something != 'string')
        something = JSON.stringify(something);

    try {
        JSON.parse(something);
        return true;
    } catch (e) {
        return false;
    }
}

あなたはそれを使うことができます:

var myJson = [{"user":"chofoteddy"}, {"user":"bart"}];
isJSON(myJson); // true

オブジェクトがJSON型または配列型であることを検証する最良の方法は次のとおりです。

var a = [],
    o = {};

解決策1

toString.call(o) === '[object Object]'; // true
toString.call(a) === '[object Array]'; // true

解決策2

a.constructor.name === 'Array'; // true
o.constructor.name === 'Object'; // true

ただし、厳密に言えば、配列はJSON構文の一部です。したがって、次の2つの例はJSON応答の一部です。

console.log(response); // {"message": "success"}
console.log(response); // {"user": "bart", "id":3}

そして:

console.log(response); // [{"user":"chofoteddy"}, {"user":"bart"}]
console.log(response); // ["chofoteddy", "bart"]

AJAX/JQuery(推奨)

JQueryを使用してAJAX経由で情報を取得する場合。 「dataType」属性に「json」値を入力することをお勧めします。JSONを取得するかどうかにかかわらず、JQueryはそれを検証し、関数「success」および「error」で通知します。例:

$.ajax({
    url: 'http://www.something.com',
    data: $('#formId').serialize(),
    method: 'POST',
    dataType: 'json',
    // "sucess" will be executed only if the response status is 200 and get a JSON
    success: function (json) {},
    // "error" will run but receive state 200, but if you miss the JSON syntax
    error: function (xhr) {}
});
17
Chofoteddy

JQueryがある場合は、 isPlainObject を使用します。

if ($.isPlainObject(my_var)) {}
13
thnee
var checkJSON = function(m) {

   if (typeof m == 'object') { 
      try{ m = JSON.stringify(m); }
      catch(err) { return false; } }

   if (typeof m == 'string') {
      try{ m = JSON.parse(m); }
      catch (err) { return false; } }

   if (typeof m != 'object') { return false; }
   return true;

};


checkJSON(JSON.parse('{}'));      //true
checkJSON(JSON.parse('{"a":0}')); //true
checkJSON('{}');                  //true
checkJSON('{"a":0}');             //true
checkJSON('x');                   //false
checkJSON('');                    //false
checkJSON();                      //false
6
luizhp

それは単なるfalseとjsonオブジェクトなので、falseであるかどうかを確認してください。そうでなければ、jsonでなければなりません。

if(ret == false || ret == "false") {
    // json
}
4
Andreas Wong

このスレッドはすでに回答されていますが、ここに来ても私の問題は本当に解決しませんでした。この関数はどこか他の場所で見つかりました。多分ここに来る人は、それが彼らにとって何らかの有用であるとわかるでしょう。

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}
2
pythonian29033
var data = 'json string ?';
var jdata = null;
try
{
    jdata = $.parseJSON(data);  
}catch(e)
{}

if(jdata)
{
//use jdata
}else
{
//use data
}
1

有効なJSONを明示的にテストする場合(戻り値falseがない場合とは対照的に)、 here で説明されている解析アプローチを使用できます。

0
Ken Redler

私は受け入れられた答えが本当に好きではありません。何よりもまずjQueryが必要です。jQueryは常に利用可能または必須ではありません。第二に、それは私にとってはやり過ぎであるオブジェクトの完全な文字列化を行います。以下は、値がJSONに似ているかどうかを完全に検出する単純な関数です。汎用性のために lodash ライブラリの一部を使用します。

import * as isNull from 'lodash/isNull'
import * as isPlainObject from 'lodash/isPlainObject'
import * as isNumber from 'lodash/isNumber'
import * as isBoolean from 'lodash/isBoolean'
import * as isString from 'lodash/isString'
import * as isArray from 'lodash/isArray'

function isJSON(val) {
  if (isNull(val)
   || isBoolean(val)
   || isString(val))
    return true;
  if (isNumber(val)) 
     return !isNaN(val) && isFinite(val)
  if (isArray(val))
    return Array.prototype.every.call(val, isJSON)
  if (isPlainObject(val)) {
    for (const key of Object.keys(val)) {
      if (!isJSON(val[key]))
        return false
    }
    return true
  }
  return false
}

時間をかけてパッケージとしてnpmに配置することさえしました: https://npmjs.com/package/is-json-objectWebpack のようなものと一緒に使用して、ブラウザで取得します。

これが誰かを助けることを願っています!

0
samvv

JSONオブジェクトを検証するためにこれを使用しています

function isJsonObject(obj) {
    try {
        JSON.parse(JSON.stringify(obj));
    } catch (e) {
        return false;
    }
    return true;
}

JSON文字列を検証するためにこれを使用しています

function isJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
0
Abhishek Goel