Bir değerin bir json nesnesi olup olmadığını nasıl kontrol edebilirim?


102

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?


2
Eğer gerçekten "sizin" sunucu tarafı kodunuzsa, bu "bazen-bu-JSON-ve-bazen-öyle-değil" durumunu oluşturmak yerine neden JSON sonucunda bir durum alanı olmasın?
HostileFork

@Hostile Hata ayıklama nedenleri için. Artık sunucunun ne tür bir hata vereceğini asla ve bu noktada json kullanılmıyor.
bart

1
Hala sunucu yanıtında bir hata kodunun (adlandırılmış alan olarak) bunu nasıl baltalayacağını anlamıyorum. Freebase için yeterince iyi! wiki.freebase.com/wiki/MQL_errors
HostileFork,

Lütfen kabul edilen yanıtı Serguei Federov'un yanıtına değiştirin, eğer yapabiliyorsanız şu anda kabul edilen yanıt yanlıştır.
Serj Sagan

"Json nesnesi" nedir? JSON dizeleri ve JS nesneleri vardır, ancak "JavaScript Object Notation nesnesi" diye bir şey yoktur.
mpen

Yanıtlar:


107

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

29
ParseJSON'un JSON değerlerinden (ör. HTML) başka bir şeyle uğraşması mümkünse, istisnalar için bir dene / yakala kullanman gerekebilir
acorncom

2
JQuery 1.9'dan önce, $ .parseJSON, geçerli JSON olmasa bile, boş bir dize, null veya tanımsız geçirilmişse bir hata atmak yerine null döndürüyordu. jquery site bağlantısı
gloomy.penguin

7
Bu çözüm en iyisi değil çünkü dönüş "SyntaxError: JSON.parse: unexpected character"hatası! , Bence en iyi çözüm, Serguei Fedorovburada belirtilen dene / yakala kullan : stackoverflow.com/questions/4295386/…
Nabi KAZ

2
Jquery kullanmak istemiyorsanız, burada açıklandığı gibi yapıcı türünü kontrol ederek vanilya JS'yi kullanabilirsiniz: stackoverflow.com/questions/11182924/…
Mat

2
Bu cevap yanlıştır, Serguei Federov'un cevabı kabul edilen cevap olmalıdır.
Serj Sagan

148

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.


Soru hiçbir noktada JSON olmayan dizelerle ilgili değil. Sunucu her zaman geçerli bir JSON döndürür (bir dize falseaynı zamanda geçerli bir JSON'dur). Soru yalnızca tek bir noktayla ilgili: Ayrıştırılan JSON dizesinin bir boole falseveya bir nesne olup olmadığını nasıl ayırt
edersiniz

2
Performans değerlendirmesi: Bunu bir işleve sarmak, json'u iki kez ayrıştırmadığınızdan emin olun (bir kez try catch içinde ve bir kez işlevi çağıran kodda.)
Michiel Cornille

Bu bir yardımcıları işlev var isJSON () kendinizin kullanabileceği: isJSON(someValue).
Chofoteddy

19

3. Çözüm (en hızlı yol)

/**
 * @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 = {};

1.Çözüm

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

2.Çözüm

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 / JQuery (önerilir)

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) {}
});

13

JQuery'niz varsa, isPlainObject kullanın .

if ($.isPlainObject(my_var)) {}

5
Bir dizede isPlainObject kullanırsanız, false döndürür, örneğin jQuery.isPlainObject ('{}')
Roy

Daha da önemlisi, özellik olarak JSON benzeri olmayan bir değer içeriyorsa, belgelere göre bu işlev yine de dönecektir 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

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
}

2

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

1
var data = 'json string ?';
var jdata = null;
try
{
    jdata = $.parseJSON(data);  
}catch(e)
{}

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

0

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 .


0

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!


0

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

0

önerilen tüm cevapları denedim, hiçbir şey benim için işe yaramadı, bu yüzden kullanmak zorunda kaldım

jQuery.isEmptyObject()

bu konuda başkasına yardım eden çapa


-1

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 */
};

@bart, nesneyi sadece if koşulunda sağlayabilirsiniz, bu kontrolü yapacak.
kobe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.