私のサーバー側コードは、成功するとjsonオブジェクトであり、失敗すると文字列 'false'である値を返します。戻り値がjsonオブジェクトかどうかを確認するにはどうすればよいですか?
私のサーバー側コードは、成功するとjsonオブジェクトであり、失敗すると文字列 'false'である値を返します。戻り値がjsonオブジェクトかどうかを確認するにはどうすればよいですか?
回答:
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
}
}
"SyntaxError: JSON.parse: unexpected character"
エラーを返すため、このソリューションは最適ではありません。、私は最善の解決策はで言っ利用のtry / catchであると考えてSerguei Fedorov
:ここでstackoverflow.com/questions/4295386/...
選択したソリューションは、私が
"Unexpected Token <"
Chromeのエラー。これは、解析が行われて未知の文字が見つかるとすぐにエラーがスローされるためです。ただし、ajaxを介して文字列値のみを返す場合、これを回避する方法があります(これは、PHPまたはASPXを使用してajaxリクエストを処理し、条件に応じてJSONを返す場合と返さない場合にかなり役立ちます)
解決策は非常に単純です。次のようにして、有効なJSONリターンであるかどうかを確認できます。
var IS_JSON = true;
try
{
var json = $.parseJSON(msg);
}
catch(err)
{
IS_JSON = false;
}
前に述べたように、これはAJAXリクエストから文字列型のものを返す場合、または混合型を返す場合の解決策です。
false
も有効なJSONです)。問題は、単一のポイントのみに関するものです。解析されたJSON文字列がブール値であるfalse
かオブジェクトであるかを
isJSON(someValue)
。
/**
* @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 = {};
toString.call(o) === '[object Object]'; // true
toString.call(a) === '[object Array]'; // true
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"]
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) {}
});
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
それは単にfalseとjsonオブジェクトなので、それがfalseかどうかを確認してみませんか。それ以外の場合は、jsonである必要があります。
if(ret == false || ret == "false") {
// json
}
このスレッドはすでに回答済みであることは知っていますが、ここに来ても問題は解決しませんでした。この関数は別の場所にありました。たぶんここに来る人は、それが彼らにとっていくらか役立つと思うでしょう。
function getClass(obj) {
if (typeof obj === "undefined")
return "undefined";
if (obj === null)
return "null";
return Object.prototype.toString.call(obj)
.match(/^\[object\s(.*)\]$/)[1];
}
var data = 'json string ?';
var jdata = null;
try
{
jdata = $.parseJSON(data);
}catch(e)
{}
if(jdata)
{
//use jdata
}else
{
//use data
}
受け入れられた答えは本当に好きではありません。何よりもまず、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-object。Webpackなどと一緒に使用して、ブラウザーで取得します。
これが誰かを助けることを願っています!