Bagaimana cara memeriksa apakah suatu nilai adalah objek json?


101

Kode sisi server saya mengembalikan nilai yang merupakan objek json pada kesuksesan dan string 'false' pada kegagalan. Sekarang bagaimana saya bisa memeriksa apakah nilai yang dikembalikan adalah objek json?


2
Jika sebenarnya itu adalah kode sisi server "Anda", mengapa tidak memiliki bidang status di hasil JSON daripada membuat situasi "kadang-kadang-JSON-dan-kadang-bukan" ini ...?
HostileFork mengatakan jangan percaya SE

@Hostile Untuk alasan debugging. Anda tidak pernah tahu jenis kegagalan apa yang akan dilemparkan server dan pada saat itu json tidak digunakan.
bart

1
Saya masih tidak melihat bagaimana memiliki kode kesalahan (sebagai bidang bernama) dalam respons server akan merusaknya. Cukup bagus untuk Freebase! wiki.freebase.com/wiki/MQL_errors
HostileFork mengatakan jangan percaya SE

Silakan ubah jawaban yang diterima ke Serguei Federov's, jika Anda bisa, jawaban yang diterima saat ini salah.
Serj Sagan

Apa itu "objek json"? Ada string JSON dan objek JS, tetapi tidak ada yang namanya "objek Notasi Objek JavaScript".
mpen

Jawaban:


105

jQuery.parseJSON () harus mengembalikan objek bertipe "object", jika stringnya adalah JSON, jadi Anda hanya perlu memeriksa jenisnya dengan 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
Mungkin juga perlu menggunakan try / catch untuk pengecualian jika mungkin parseJSON akan berurusan dengan sesuatu selain nilai JSON (yaitu HTML)
acorncom

2
Sebelum jQuery 1.9, $ .parseJSON mengembalikan null alih-alih menampilkan kesalahan jika itu diteruskan string kosong, null, atau tidak ditentukan, meskipun itu bukan JSON yang valid. tautan situs jquery
gloomy.penguin

7
Solusi ini bukan yang terbaik, karena "SyntaxError: JSON.parse: unexpected character"kesalahan pengembalian ! , Saya pikir solusi terbaik adalah menggunakan coba / tangkap yang dikatakan Serguei Fedorovdi sini: stackoverflow.com/questions/4295386/…
Nabi KAZ

2
Jika Anda tidak ingin menggunakan jquery, Anda dapat menggunakan vanilla JS dengan memeriksa tipe konstruktor seperti yang dijelaskan di sini: stackoverflow.com/questions/11182924/…
Mat

2
Jawaban ini salah, jawaban Serguei Federov haruslah jawaban yang diterima.
Serj Sagan

148

Solusi yang dipilih sebenarnya tidak berhasil untuk saya karena saya mendapatkan a

     "Unexpected Token <" 

kesalahan di Chrome. Ini karena kesalahan dilemparkan segera setelah parse ditemukan dan karakter tidak dikenal. Namun, ada jalan lain jika Anda hanya mengembalikan nilai string melalui ajax (yang bisa sangat berguna jika Anda menggunakan PHP atau ASPX untuk memproses permintaan ajax dan mungkin atau mungkin tidak mengembalikan JSON tergantung pada kondisi)

Solusinya cukup sederhana, Anda dapat melakukan hal berikut untuk memeriksa apakah itu pengembalian JSON yang valid

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

Seperti yang telah saya katakan sebelumnya, ini adalah solusi jika Anda mengembalikan barang jenis string dari permintaan AJAX Anda atau jika Anda mengembalikan jenis campuran.


Pertanyaannya bukanlah tentang string non-JSON dalam hal apa pun. Server selalu mengembalikan JSON yang valid (string falsejuga merupakan JSON yang valid). Pertanyaannya hanya tentang satu titik: bagaimana membedakan jika string JSON yang diuraikan adalah boolean falseatau objek
Dr. Molle

2
Pertimbangan kinerja: Membungkus ini dalam sebuah fungsi, pastikan untuk tidak mengurai json dua kali (sekali di dalam tombol coba, dan sekali dalam kode yang memanggil fungsi tersebut.)
Michiel Cornille

Ini adalah pembantu berfungsi isJSON () yang dapat Anda gunakan: isJSON(someValue).
Chofoteddy

19

Solusi 3 (cara tercepat)

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

Anda bisa menggunakannya:

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

Cara terbaik untuk memvalidasi bahwa suatu objek berjenis JSON atau array adalah sebagai berikut:

var a = [],
    o = {};

Solusi 1

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

Solusi 2

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

Namun, secara tegas, array adalah bagian dari sintaks JSON. Oleh karena itu, dua contoh berikut adalah bagian dari respons JSON:

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

Dan:

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

AJAX / JQuery (disarankan)

Jika Anda menggunakan JQuery untuk membawa informasi melalui AJAX. Saya sarankan Anda memasukkan atribut "dataType" dengan nilai "json", dengan cara itu jika Anda mendapatkan JSON atau tidak, JQuery memvalidasinya untuk Anda dan membuatnya dikenal melalui fungsi "berhasil" dan "kesalahan". Contoh:

$.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

Jika Anda memiliki jQuery, gunakan isPlainObject .

if ($.isPlainObject(my_var)) {}

5
Jika Anda menggunakan isPlainObject pada string, hasilnya salah, misalnya jQuery.isPlainObject ('{}')
Roy Shoa

Lebih penting lagi, jika ini berisi nilai non-JSON-like sebagai properti, menurut dokumen, fungsi ini akan tetap dikembalikan 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

Karena itu hanya objek palsu dan json, mengapa Anda tidak memeriksa apakah itu salah, jika tidak, itu pasti json.

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

2

Saya tahu utas ini sudah dijawab, tetapi datang ke sini tidak benar-benar menyelesaikan masalah saya, saya menemukan fungsi ini di tempat lain. mungkin seseorang yang datang ke sini akan menganggapnya berguna bagi mereka;

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

Jika Anda ingin menguji JSON yang valid secara eksplisit (sebagai lawan dari tidak adanya nilai yang dikembalikan false), Anda dapat menggunakan pendekatan parsing seperti yang dijelaskan di sini .


0

Saya tidak terlalu suka jawaban yang diterima. Pertama dan terpenting, ini membutuhkan jQuery, yang tidak selalu tersedia atau diperlukan. Kedua, ia melakukan stringifikasi penuh terhadap objek yang menurut saya berlebihan. Berikut adalah fungsi sederhana yang secara menyeluruh mendeteksi apakah suatu nilai mirip JSON, menggunakan tidak lebih dari beberapa bagian pustaka lodash untuk sifat umum .

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
}

Saya bahkan telah meluangkan waktu untuk memasangnya di npm sebagai satu paket: https://npmjs.com/package/is-json-object . Gunakan bersama dengan sesuatu seperti Webpack untuk mendapatkannya di browser.

Semoga ini bisa membantu seseorang!


0

Saya menggunakan ini untuk memvalidasi Objek JSON

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

Saya menggunakan ini untuk memvalidasi String JSON

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

0

saya mencoba semua jawaban yang disarankan, tidak ada yang berhasil untuk saya, jadi saya harus menggunakan

jQuery.isEmptyObject()

cangkul yang membantu orang lain mengatasi masalah ini


-1

Anda harus selalu mengembalikan json , tetapi mengubah statusnya , atau dalam contoh berikut properti ResponseCode :

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

@bart, Anda cukup memberikan objek dalam kondisi if, yang akan melakukan pemeriksaan.
kobe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.