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


101

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


2
それが実際に「あなたの」サーバー側コードである場合、この「時々-それは-JSON-そして時-それは-ない」状況を作成するのではなく、JSON結果にステータスフィールドがないのはなぜですか?
HostileForkはSEを信頼してはならないと

@Hostileデバッグのため。これで、サーバーがスローする障害の種類はなくなり、その時点ではjsonは使用されていません。
バート

1
サーバーの応答にエラーコードが(名前付きフィールドとして)あるとどうなるかはまだわかりません。Freebaseには十分です! wiki.freebase.com/wiki/MQL_errors
HostileForkはSEを信用しないと

現在受け入れられている回答が正しくない場合は、受け入れられている回答をセルゲイフェデロフに変更してください。
Serj Sagan、2015

「jsonオブジェクト」とは何ですか?JSON文字列とJSオブジェクトがありますが、「JavaScript Object Notationオブジェクト」のようなものはありません。
mpen 2016年

回答:


105

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
  }
}

29
また、parseJSONがJSON値(HTML)以外のものを処理する可能性がある場合は、例外に対してtry / catchを使用する必要があるかもしれません
acorncom

2
jQuery 1.9より前のバージョンでは、空の文字列、null、またはundefinedが渡された場合、$。parseJSONは有効なJSONではないにもかかわらず、エラーをスローする代わりにnullを返しました。jqueryサイトリンク
gloomy.penguin 2013年

7
"SyntaxError: JSON.parse: unexpected character"エラーを返すため、このソリューションは最適ではありません。、私は最善の解決策はで言っ利用のtry / catchであると考えてSerguei Fedorov:ここでstackoverflow.com/questions/4295386/...
ナビKAZ

2
あなたはjqueryのを使用したくない場合は、ここで説明するように、あなたは、コンストラクタの種類を確認することでバニラJSを使用することができます。stackoverflow.com/questions/11182924/...
マット

2
この答えは正しくありません。セルゲイフェデロフの答えが受け入れられるはずです。
Serj Sagan、2015

148

選択したソリューションは、私が

     "Unexpected Token <" 

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

解決策は非常に単純です。次のようにして、有効なJSONリターンであるかどうかを確認できます。

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

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


問題は、JSON以外の文字列に関するものではありません。サーバーは常に有効なJSONを返します(文字列falseも有効なJSONです)。問題は、単一のポイントのみに関するものです。解析されたJSON文字列がブール値であるfalseかオブジェクトであるかを
区別する

2
パフォーマンスの考慮事項:機能でこれをラッピング、二回JSONを解析しないようにしてください(一度トライキャッチ内部、および関数を呼び出すコードに一度。)
ミシェルCornille

これは、使用できるヘルパー関数isJSON()ですisJSON(someValue)
Chofoteddy 2018年

19

ソリューション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) {}
});

13

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

if ($.isPlainObject(my_var)) {}

5
文字列に対してisPlainObjectを使用すると、たとえばjQuery.isPlainObject( '{}')などのfalseを返します
Roy Shoa

さらに重要なのは、JSONに似ていない値がプロパティとして含まれている場合、ドキュメントによると、この関数はを返しtrueます。
samvv

6
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

4

それは単にfalseとjsonオブジェクトなので、それがfalseかどうかを確認してみませんか。それ以外の場合は、jsonである必要があります。

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

2

このスレッドはすでに回答済みであることは知っていますが、ここに来ても問題は解決しませんでした。この関数は別の場所にありました。たぶんここに来る人は、それが彼らにとっていくらか役立つと思うでしょう。

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}


0

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


0

受け入れられた答えは本当に好きではありません。何よりもまず、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

これを使用して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

提案されたすべての答えを試しましたが、何もうまくいきませんでしたので、

jQuery.isEmptyObject()

この問題で他の誰かを助ける鍬


-1

常に jsonを返す必要がありますが、そのステータスを変更するか、次の例ではResponseCodeプロパティを変更します。

if(callbackResults.ResponseCode!="200"){
    /* Some error, you can add a message too */
} else {
    /* All fine, proceed with code */
};

@bart、チェックを行うif条件でオブジェクトを提供できます。
神戸2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.