Sunucu tarafındaki kodum, başarı durumunda bir json nesnesi ve başarısızlık durumunda 'yanlış' dizesi olan bir değer döndürür. Şimdi, döndürülen değerin bir json nesnesi olup olmadığını nasıl kontrol edebilirim?
Sunucu tarafındaki kodum, başarı durumunda bir json nesnesi ve başarısızlık durumunda 'yanlış' dizesi olan bir değer döndürür. Şimdi, döndürülen değerin bir json nesnesi olup olmadığını nasıl kontrol edebilirim?
Yanıtlar:
jQuery.parseJSON (), dize JSON ise, "nesne" türünde bir nesne döndürmelidir, bu nedenle türü yalnızca 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"
hatası! , Bence en iyi çözüm, Serguei Fedorov
burada belirtilen dene / yakala kullan : stackoverflow.com/questions/4295386/…
Seçilen çözüm aslında benim için işe yaramıyor çünkü bir
"Unexpected Token <"
Chrome'da hata. Bunun nedeni, ayrıştırma gelir gelmez ve bilinmeyen karakterle karşılaşıldığında hatanın atılmasıdır. Bununla birlikte, ajax aracılığıyla yalnızca dize değerlerini döndürüyorsanız, bunun bir yolu vardır (ajax isteklerini işlemek için PHP veya ASPX kullanıyorsanız ve koşullara bağlı olarak JSON döndürebilir veya dönmeyebilir) oldukça yararlı olabilir.
Çözüm oldukça basit, geçerli bir JSON dönüşü olup olmadığını kontrol etmek için aşağıdakileri yapabilirsiniz.
var IS_JSON = true;
try
{
var json = $.parseJSON(msg);
}
catch(err)
{
IS_JSON = false;
}
Daha önce de söylediğim gibi, AJAX isteğinizden dize türü şeyler döndürüyorsanız veya karışık türü döndürüyorsanız, çözüm budur.
false
aynı zamanda geçerli bir JSON'dur). Soru yalnızca tek bir noktayla ilgili: Ayrıştırılan JSON dizesinin bir boole false
veya bir nesne olup olmadığını nasıl ayırt
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;
}
}
Kullanabilirsiniz:
var myJson = [{"user":"chofoteddy"}, {"user":"bart"}];
isJSON(myJson); // true
Bir nesnenin JSON veya dizi türünde olduğunu doğrulamanın en iyi yolu aşağıdaki gibidir:
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
Ancak, kesinlikle konuşursak, bir dizi JSON sözdiziminin bir parçasıdır. Bu nedenle, aşağıdaki iki örnek bir JSON yanıtının parçasıdır:
console.log(response); // {"message": "success"}
console.log(response); // {"user": "bart", "id":3}
Ve:
console.log(response); // [{"user":"chofoteddy"}, {"user":"bart"}]
console.log(response); // ["chofoteddy", "bart"]
AJAX aracılığıyla bilgi getirmek için JQuery kullanıyorsanız. "DataType" özniteliğine "json" değerini eklemenizi öneririm, bu şekilde bir JSON alırsanız veya almazsanız, JQuery sizin için onu doğrular ve "başarı" ve "hata" işlevleri aracılığıyla bilinir hale getirir. Misal:
$.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) {}
});
JQuery'niz varsa, isPlainObject kullanın .
if ($.isPlainObject(my_var)) {}
true
.
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
Sadece yanlış ve json nesnesi olduğuna göre, neden yanlış olup olmadığını kontrol etmiyorsunuz, aksi takdirde json olmalı.
if(ret == false || ret == "false") {
// json
}
Bu konuya zaten yanıt verildiğini biliyorum, ancak buraya gelmek sorunlarımı gerçekten çözmedi, bu işlevi başka bir yerde buldum. belki buraya gelen biri bunun onlara bir faydası olacağını görecektir;
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
}
Geçerli JSON için açıkça test etmek istiyorsanız (döndürülen değerin yokluğunun aksine false
), burada açıklandığı gibi bir ayrıştırma yaklaşımı kullanabilirsiniz .
Kabul edilen cevabı gerçekten beğenmedim. Her şeyden önce, her zaman mevcut olmayan veya gerekli olmayan jQuery gerektirir. İkincisi, bana göre aşırı olan nesnenin tam bir dizilişini yapıyor. İşte , jeneriklik için lodash kütüphanesinin birkaç bölümünden başka bir şey kullanmadan, bir değerin JSON benzeri olup olmadığını iyice tespit eden basit bir fonksiyon .
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
}
Hatta paket olarak npm'ye koymak için zaman ayırdım: https://npmjs.com/package/is-json-object . Webpack gibi bir şeyle birlikte kullanınTarayıcıya almak için .
Umarım bu birine yardımcı olur!
JSON Nesnesini doğrulamak için bunu kullanıyorum
function isJsonObject(obj) {
try {
JSON.parse(JSON.stringify(obj));
} catch (e) {
return false;
}
return true;
}
JSON Dizesini doğrulamak için bunu kullanıyorum
function isJsonString(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
Her zaman json döndürmeli , ancak durumunu değiştirmelisiniz veya aşağıdaki örnekte ResponseCode özelliğini değiştirmelisiniz:
if(callbackResults.ResponseCode!="200"){
/* Some error, you can add a message too */
} else {
/* All fine, proceed with code */
};