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?
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?
Câu trả lời:
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
}
}
"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/...
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.
false
cũ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 false
hoặc một đối tượng
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;
}
}
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 = {};
toString.call(o) === '[object Object]'; // true
toString.call(a) === '[object Array]'; // true
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"]
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) {}
});
Nếu bạn có jQuery, hãy sử dụng isPlainObject .
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
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
}
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];
}
var data = 'json string ?';
var jdata = null;
try
{
jdata = $.parseJSON(data);
}catch(e)
{}
if(jdata)
{
//use jdata
}else
{
//use data
}
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 .
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 đó!
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;
}
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 */
};