Làm cách nào để kiểm tra xem một giá trị có phải là một đối tượng json không?


101

Mã phía máy chủ của tôi trả về một giá trị là một đối tượng json khi thành công và một chuỗi 'false' khi thất bại. Bây giờ làm cách nào để kiểm tra xem giá trị trả về có phải là đối tượng json hay không?


2
Nếu đó thực sự là mã phía máy chủ "của bạn", tại sao không có trường trạng thái trong kết quả JSON thay vì tạo ra tình huống "đôi khi-nó-JSON-và đôi khi-nó-không" này ...?
HostileFork nói không tin tưởng SE,

@Hostile Vì lý do gỡ lỗi. Bây giờ bạn không bao giờ có loại lỗi nào mà máy chủ sẽ gây ra và tại thời điểm đó json không được sử dụng.
bart

1
Tôi vẫn không hiểu việc có mã lỗi (dưới dạng trường được đặt tên) trong phản hồi máy chủ sẽ làm suy yếu điều đó như thế nào. Nó đủ tốt cho Freebase! wiki.freebase.com/wiki/MQL_errors
HostileFork nói không tin tưởng SE vào

Vui lòng thay đổi câu trả lời được chấp nhận thành câu trả lời của Serguei Federov, nếu bạn có thể, câu trả lời hiện được chấp nhận là không chính xác.
Serj Sagan

"Đối tượng json" là gì? Có các chuỗi JSON và các đối tượng JS, nhưng không có cái gọi là "đối tượng Ký hiệu Đối tượng JavaScript".
mpen

Câu trả lời:


105

jQuery.parseJSON () phải trả về một đối tượng kiểu "object", nếu chuỗi là JSON, vì vậy bạn chỉ phải kiểm tra kiểu với 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
Cũng có thể cần phải sử dụng một try / catch cho trường hợp ngoại lệ nếu nó có thể là parseJSON sẽ được làm việc với một cái gì đó khác hơn so với giá trị JSON (tức là HTML)
acorncom

2
Trước jQuery 1.9, $ .parseJSON trả về null thay vì ném lỗi nếu nó được truyền vào một chuỗi rỗng, null hoặc không xác định, ngay cả khi chúng không phải là JSON hợp lệ. liên kết trang web jquery
ảm đạm.penguin

7
Giải pháp này không phải là tốt nhất, vì "SyntaxError: JSON.parse: unexpected character"lỗi trả lại ! , Tôi nghĩ rằng giải pháp tốt nhất là sử dụng try / catch mà nói bởi Serguei Fedorovở đây: stackoverflow.com/questions/4295386/...
Nabi KAZ

2
Nếu bạn không muốn sử dụng jquery, bạn có thể sử dụng vanilla JS bằng cách kiểm tra loại phương thức khởi tạo như được mô tả tại đây: stackoverflow.com/questions/11182924/…
Mat

2
Câu trả lời này không chính xác, câu trả lời của Serguei Federov nên là câu trả lời được chấp nhận.
Serj Sagan

148

Giải pháp đã chọn không thực sự hiệu quả với tôi vì tôi nhận được

     "Unexpected Token <" 

trong Chrome. Điều này là do lỗi được đưa ra ngay khi phân tích cú pháp xuất hiện và ký tự không xác định. Tuy nhiên, có một cách để giải quyết vấn đề này nếu bạn chỉ trả lại các giá trị chuỗi thông qua ajax (điều này có thể khá hữu ích nếu bạn đang sử dụng PHP hoặc ASPX để xử lý các yêu cầu ajax và có thể hoặc không trả về JSON tùy thuộc vào điều kiện)

Giải pháp khá đơn giản, bạn có thể làm như sau để kiểm tra xem đó có phải là trả về JSON hợp lệ hay không

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

Như tôi đã nói trước đây, đây là giải pháp nếu bạn đang trả về nội dung loại chuỗi từ yêu cầu AJAX của mình hoặc nếu bạn đang trả về loại hỗn hợp.


Câu hỏi không liên quan đến chuỗi không phải JSON. Máy chủ luôn trả về một JSON hợp lệ (một chuỗi falsecũng là JSON hợp lệ). Câu hỏi đặt ra là chỉ khoảng một điểm duy nhất: làm thế nào để phân biệt nếu phân tích cú pháp JSON-string là một boolean falsehoặc một đối tượng
Dr.Molle

2
Xem xét hiệu suất: Bao bì này trong một hàm, hãy chắc chắn để không phân tích json hai lần (một lần bên trong catch, và một lần trong đoạn code đó gọi hàm.)
Michiel Cornille

Đó là một người giúp đỡ hoạt động isJSON () mà bạn có thể sử dụng: isJSON(someValue).
Chofoteddy

19

Giải pháp 3 (cách nhanh nhất)

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

Bạn co thể sử dụng no:

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

Cách tốt nhất để xác thực rằng một đối tượng là kiểu JSON hoặc mảng như sau:

var a = [],
    o = {};

Giải pháp 1

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

Giải pháp 2

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

Nhưng, nói đúng ra, một mảng là một phần của cú pháp JSON. Do đó, hai ví dụ sau là một phần của phản hồi JSON:

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

Và:

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

AJAX / JQuery (được khuyến nghị)

Nếu bạn sử dụng JQuery để đưa thông tin qua AJAX. Tôi khuyên bạn nên đặt thuộc tính "dataType" giá trị "json", theo cách đó, nếu bạn nhận được JSON hay không, JQuery xác thực nó cho bạn và làm cho nó được biết đến thông qua các hàm "thành công" và "lỗi". Thí dụ:

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

Nếu bạn có jQuery, hãy sử dụng isPlainObject .

if ($.isPlainObject(my_var)) {}

5
Nếu bạn sử dụng isPlainObject trên một chuỗi nó trả về false, ví dụ như jQuery.isPlainObject ( '{}')
Roy Shoa

Quan trọng hơn, nếu nó chứa giá trị không giống JSON làm thuộc tính, thì theo tài liệu, hàm này sẽ vẫn trả về 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

Vì nó chỉ là false và đối tượng json, tại sao bạn không kiểm tra xem nó có phải là false hay không, nếu không nó phải là json.

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

2

Tôi biết chủ đề này đã được trả lời rồi, nhưng đến đây không thực sự giải quyết được vấn đề của tôi, tôi tìm thấy chức năng này ở một nơi khác. có thể ai đó đến đây sẽ thấy nó có ích cho họ;

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

Nếu bạn muốn kiểm tra rõ ràng JSON hợp lệ (trái ngược với việc không có giá trị trả về false), thì bạn có thể sử dụng phương pháp phân tích cú pháp như được mô tả ở đây .


0

Tôi không thực sự thích câu trả lời được chấp nhận. Trước hết, nó yêu cầu jQuery, không phải lúc nào cũng có sẵn hoặc bắt buộc phải có. Thứ hai, nó thực hiện một chuỗi đầy đủ của đối tượng mà đối với tôi là quá mức cần thiết. Đây là một hàm đơn giản giúp phát hiện một cách triệt để liệu một giá trị có giống JSON hay không, chỉ sử dụng một vài phần của thư viện lodash cho tính chung chung.

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
}

Tôi thậm chí đã dành thời gian để đưa nó vào npm dưới dạng một gói: https://npmjs.com/package/is-json-object . Sử dụng nó cùng với một cái gì đó như Webpack để đưa nó vào trình duyệt.

Hy vọng điều này sẽ giúp ai đó!


0

Tôi đang sử dụng cái này để xác thực Đối tượng JSON

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

Tôi đang sử dụng cái này để xác thực chuỗi JSON

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

0

Tôi đã thử tất cả các câu trả lời được đề xuất, không có gì phù hợp với tôi, vì vậy tôi phải sử dụng

jQuery.isEmptyObject()

cuốc đất giúp người khác giải quyết vấn đề này


-1

Bạn nên trả về json luôn luôn , nhưng thay đổi trạng thái của nó hoặc trong ví dụ sau thuộc tính Mã phản hồi :

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

@bart, bạn chỉ có thể cung cấp đối tượng trong điều kiện if, điều đó sẽ thực hiện việc kiểm tra.
kobe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.