Sesuatu seperti:
var jsonString = '{ "Id": 1, "Name": "Coke" }';
//should be true
IsJsonString(jsonString);
//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")
Larutan tidak boleh mengandung try/catch. Beberapa dari kita mengaktifkan "break di semua kesalahan" dan mereka don't seperti debugger melanggar pada orang-orang yang tidak valid JSON string.
Aku tahu aku'm 3 tahun terlambat untuk pertanyaan ini, tapi aku merasa seperti berdentang.
Sementara Gumbo's solusi karya besar, itu doesn't menangani beberapa kasus di mana tidak terkecuali dibesarkan untuk JSON.mengurai({sesuatu yang isn't JSON})
Saya juga lebih memilih untuk kembali parsing JSON pada saat yang sama, sehingga memanggil kode doesn't harus memanggil JSON.mengurai(jsonString)
a untuk kedua kalinya.
Hal ini tampaknya bekerja dengan baik untuk kebutuhan saya:
function tryParseJSON (jsonString){
try {
var o = JSON.parse(jsonString);
// Handle non-exception-throwing cases:
// Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
// but... JSON.parse(null) returns null, and typeof null === "object",
// so we must check for that, too. Thankfully, null is falsey, so this suffices:
if (o && typeof o === "object") {
return o;
}
}
catch (e) { }
return false;
};
Komentar pertama. Pertanyaan tentang tidak menggunakan try/catch
.
Jika anda tidak keberatan untuk menggunakannya, baca jawabannya di bawah ini.
Di sini kita hanya memeriksa JSON
string menggunakan regexp, dan itu akan bekerja dalam kebanyakan kasus, tidak semua kasus.
Melihat-lihat di sekitar garis 450 https://github.com/douglascrockford/JSON-js/blob/master/json2.js
Ada regexp yang memeriksa valid JSON, seperti:
if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
//the json is ok
}else{
//the json is not ok
}
EDIT: versi baru dari json2.js membuat yang lebih canggih parsing dari atas, tetapi masih didasarkan pada regexp menggantikan ( dari komentar @Mrchief )
// vanillaJS
function isJSON(str) {
try {
return (JSON.parse(str) && !!str);
} catch (e) {
return false;
}
}
Penggunaan: isJSON({})
akan menjadi false
, isJSON('{}')
akan menjadi true
.
Untuk memeriksa apakah ada sesuatu yang Array
atau Objek
(diurai JSON):
// vanillaJS
function isAO(val) {
return val instanceof Array || val instanceof Object ? true : false;
}
// ES2015
var isAO = (val) => val instanceof Array || val instanceof Object ? true : false;
Penggunaan: isAO({})
akan menjadi true
, isAO('{}')
akan palsu
.
Dulu aku benar-benar metode sederhana untuk memeriksa string bagaimana hal itu's yang valid JSON atau tidak.
function testJSON(text){
if (typeof text!=="string"){
return false;
}
try{
JSON.parse(text);
return true;
}
catch (error){
return false;
}
}
Hasil yang valid string JSON:
var input='["foo","bar",{"foo":"bar"}]';
testJSON(input); // returns true;
Hasil dengan sebuah string sederhana;
var input='This is not a JSON string.';
testJSON(input); // returns false;
Hasil dengan suatu objek:
var input={};
testJSON(input); // returns false;
Hasil dengan null input:
var input=null;
testJSON(input); // returns false;
Yang terakhir mengembalikan false karena jenis null variabel adalah objek.
Ini bekerja setiap saat. :)
Di sini saya kerja kode:
function IsJsonString(str) {
try {
var json = JSON.parse(str);
return (typeof json === 'object');
} catch (e) {
return false;
}
}
Dari Prototipe kerangka String.isJSON
definisi di sini
/**
* String#isJSON() -> Boolean
*
* Check if the string is valid JSON by the use of regular expressions.
* This security method is called internally.
*
* ##### Examples
*
* "something".isJSON();
* // -> false
* "\"something\"".isJSON();
* // -> true
* "{ foo: 42 }".isJSON();
* // -> false
* "{ \"foo\": 42 }".isJSON();
* // -> true
**/
function isJSON() {
var str = this;
if (str.blank()) return false;
str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/).test(str);
}
jadi, ini adalah versi yang dapat digunakan lewat sebuah objek string
function isJSON(str) {
if ( /^\s*$/.test(str) ) return false;
str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/).test(str);
}
function isJSON(str) {
if ( /^\s*$/.test(str) ) return false;
str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/).test(str);
}
console.log ("this is a json", isJSON( "{ \"key\" : 1, \"key2@e\" : \"val\"}" ) )
console.log("this is not a json", isJSON( "{ \"key\" : 1, \"key2@e\" : pippo }" ) )
Mungkin itu akan berguna:
function parseJson(code)
{
try {
return JSON.parse(code);
} catch (e) {
return code;
}
}
function parseJsonJQ(code)
{
try {
return $.parseJSON(code);
} catch (e) {
return code;
}
}
var str = "{\"a\":1,\"b\":2,\"c\":3,\"d\":4,\"e\":5}";
alert(typeof parseJson(str));
alert(typeof parseJsonJQ(str));
var str_b = "c";
alert(typeof parseJson(str_b));
alert(typeof parseJsonJQ(str_b));
output:
IE7: string,objek,string,string
CHROME: objek,objek,string,string
jawaban Ini untuk mengurangi biaya trycatch pernyataan.
Saya menggunakan JQuery untuk parse JSON string dan saya digunakan trycatch pernyataan untuk menangani pengecualian, tetapi melemparkan pengecualian untuk un-parsable string melambat kode saya, jadi saya menggunakan simple Regex untuk memeriksa string jika itu adalah mungkin JSON string atau tidak tanpa bulu dengan memeriksa itu's sintaks, maka saya menggunakan cara biasa dengan parsing string menggunakan JQuery :
if (typeof jsonData == 'string') {
if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) {
return jsonData;
}
}
try {
jsonData = $.parseJSON(jsonData);
} catch (e) {
}
saya dibungkus kode sebelumnya dalam sebuah fungsi rekursif untuk mengurai bersarang JSON tanggapan.
Saya pikir saya tahu mengapa anda ingin menghindari itu. Tapi mungkin mencoba & menangkap !== try & menangkap. ;o) Ini datang ke dalam pikiran saya:
var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};
Jadi anda mungkin juga kotor klip untuk objek JSON, seperti:
JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};
Karena hal ini sebagai encapsuled mungkin, itu mungkin tidak istirahat pada kesalahan.
Berikut ini adalah ketangkasan versi:
JSONTryParse(input) {
try {
//check if the string exists
if (input) {
var o = JSON.parse(input);
//validate the result too
if (o && o.constructor === Object) {
return o;
}
}
}
catch (e) {
}
return false;
};
Saya menyimpulkan dari pembukaan komentar bahwa use case ini menggambarkan apakah respon adalah HTML atau JSON. Dalam hal ini, ketika anda tidak menerima JSON, anda mungkin harus melakukan parsing dan penanganan yang tidak valid JSON di beberapa titik dalam kode anda pula. Selain dari apa-apa, saya bayangkan anda ingin diberitahu oleh browser anda harus JSON diharapkan tetapi tidak valid JSON yang diterima (sebagai pengguna dengan proxy dari beberapa bermakna pesan kesalahan)!
Lakukan penuh regex untuk JSON adalah tidak perlu karena itu (seperti itu akan - dalam pengalaman saya - untuk sebagian besar penggunaan-kasus). Anda mungkin akan lebih baik menggunakan sesuatu seperti di bawah ini:
function (someString) {
// test string is opened with curly brace or machine bracket
if (someString.trim().search(/^(\[|\{){1}/) > -1) {
try { // it is, so now let's see if its valid JSON
var myJson = JSON.parse(someString);
// yep, we're working with valid JSON
} catch (e) {
// nope, we got what we thought was JSON, it isn't; let's handle it.
}
} else {
// nope, we're working with non-json, no need to parse it fully
}
}
yang harus menyelamatkan anda harus menangani pengecualian berlaku non-kode JSON dan mengurus duff json pada waktu yang sama.
Anda dapat menggunakan javascript eval() fungsi untuk memverifikasi apakah itu's yang valid.
misalnya
var jsonString = '{ "Id": 1, "Name": "Coke" }';
var json;
try {
json = eval(jsonString);
} catch (exception) {
//It's advisable to always catch an exception since eval() is a javascript executor...
json = null;
}
if (json) {
//this is json
}
Atau, anda dapat menggunakan JSON.mengurai
fungsi dari json.org:
try {
json = JSON.parse(jsonString);
} catch (exception) {
json = null;
}
if (json) {
//this is json
}
Semoga ini bisa membantu.
PERINGATAN: eval()
adalah berbahaya jika seseorang menambahkan berbahaya kode JS, karena itu akan melaksanakannya. Pastikan JSON String dapat dipercaya, yaitu anda mendapat ini dari sumber terpercaya.
Edit Bagi saya 1 solusi,'s dianjurkan untuk melakukan hal ini.
try {
json = eval("{" + jsonString + "}");
} catch (exception) {
//It's advisable to always catch an exception since eval() is a javascript executor...
json = null;
}
Ke jaminan json-ness. Jika jsonString
isn't murni JSON, eval akan melempar pengecualian.
Oh anda pasti dapat menggunakan try catch untuk memeriksa apakah atau tidak valid JSON
Diuji pada Firfox Quantom 60.0.1
menggunakan fungsi di dalam fungsi untuk mendapatkan JSON diuji dan menggunakan output untuk memvalidasi string. mendengar contoh.
function myfunction(text){
//function for validating json string
function testJSON(text){
try{
if (typeof text!=="string"){
return false;
}else{
JSON.parse(text);
return true;
}
}
catch (error){
return false;
}
}
//content of your real function
if(testJSON(text)){
console.log("json");
}else{
console.log("not json");
}
}
//use it as a normal function
myfunction('{"name":"kasun","age":10}')
Fungsi IsJsonString(str)
, yang menggunakan JSON.mengurai(str)
, doesn't bekerja dalam kasus saya.
Saya mencoba untuk memvalidasi json output dari GraphiQL itu selalu kembali palsu. Saya beruntung, isJSON karya-karya yang lebih baik:
`` var test = false;
$('body').pada('DOMSubtreeModified', '.resultWrap', function() {
jika (!tes) { var resultWrap = "{" + $('#graphiql .resultWrap').text().split("{").pop(); jika isJSON(resultWrap) {test = !tes;} konsol.log(resultWrap); konsol.log(resultWrap.isJSON()); }
}); `` Contoh output:
`` TIGA.WebGLRenderer 79 menarik.js:170 {xxxxxxxxxx menarik.js:170 palsu menarik.js:170 {xxxxxxxxxx menarik.js:170 palsu menarik.js:170 {xxxxxxxxxx menarik.js:170 palsu menarik.js:170 {xxxxxxxxxx menarik.js:170 palsu menarik.js:170 { menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, "waktu": 1570751209006, menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, "waktu": 1570751209006, "centang": 156, menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, "waktu": 1570751209006, "centang": 156, "tickr": 1.56, menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, "waktu": 1570751209006, "centang": 156, "tickr": 1.56, "fps": 41.666666666666664, menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, "waktu": 1570751209006, "centang": 156, "tickr": 1.56, "fps": 41.666666666666664, "lebar": 396.984, menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, "waktu": 1570751209006, "centang": 156, "tickr": 1.56, "fps": 41.666666666666664, "lebar": 396.984, "tinggi": 327 menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, "waktu": 1570751209006, "centang": 156, "tickr": 1.56, "fps": 41.666666666666664, "lebar": 396.984, "tinggi": 327} menarik.js:170 palsu menarik.js:170 { "PI": 3.141592653589793, "waktu": 1570751209006, "centang": 156, "tickr": 1.56, "fps": 41.666666666666664, "lebar": 396.984, "tinggi": 327} menarik.js:170 benar
``