วิธีตรวจสอบว่าสตริงเป็นสตริง JSON ที่ถูกต้องใน JavaScript โดยไม่ต้องใช้ลอง / จับ


548

สิ่งที่ต้องการ:

var jsonString = '{ "Id": 1, "Name": "Coke" }';

//should be true
IsJsonString(jsonString);

//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")

การแก้ปัญหาไม่ควรมีลอง / จับ พวกเราบางคนเปิดใช้งาน "หยุดข้อผิดพลาดทั้งหมด" และพวกเขาไม่ต้องการให้ดีบั๊กตัวแบ่งสตริง JSON ที่ไม่ถูกต้อง


25
มีเหตุผลที่ถูกต้องที่จะไม่ใช้tryหรือไม่?
Nick T

7
@NickT เพราะถ้าคุณเปิด "หยุดข้อผิดพลาดทั้งหมด" ในโปรแกรมดีบั๊กมันจะ ตอนนี้ Chrome มีตัวเลือกในการทำลายข้อผิดพลาดที่ไม่ได้รับการบันทึก
Chi Chan

6
ใช้เพียง 2 บรรทัดเพื่อตรวจสอบด้วยลองจับ var isValidJSON = true; ลอง {JSON.parse (jsonString)} catch {isValidJSON = false; }
efkan

18
ในขณะที่ใช้งานได้มันเป็นกระบองและการฝึกฝนที่แย่มาก Try / catch มีไว้สำหรับการทำงานที่ยอดเยี่ยมและการจัดการข้อผิดพลาดไม่ใช่โฟลว์โปรแกรมทั่วไป
Tasgall

7
@Tasgall ตามกฎทั่วไปแล้วใช่ แต่คุณจะทำอย่างไรถ้าวิธีลอง / จับเป็นนักแสดงมากกว่าวิธีการตรวจสอบตาม? ใช้ตัวเลือกที่ช้าลง (บางครั้งอย่างมีนัยสำคัญ) เพียงเพราะตัวเลือกอื่นคือ "การปฏิบัติที่ไม่ดี" ไม่มีอะไรผิดปกติกับวิธีลอง / จับดังนั้นจึงไม่มีเหตุผลที่จะไม่ใช้มัน สิ่งสำคัญคือการให้โปรแกรมเมอร์ใหม่พัฒนามาตรฐานการเข้ารหัสที่ดี แต่สิ่งที่สำคัญไม่แพ้กันคือการเสริมสร้างการยึดมั่นของคนตาบอดต่อแนวทางปฏิบัติทั่วไปโดยเฉพาะอย่างยิ่งในกรณีที่แนวทางนั้นทำให้สิ่งต่าง ๆ ยากกว่าที่ควรจะเป็น
Abion47

คำตอบ:


172

ความคิดเห็นแรก try/catchคำถามคือเกี่ยวกับการไม่ได้ใช้
หากคุณไม่สนใจที่จะใช้อ่านคำตอบด้านล่าง ที่นี่เราเพียงตรวจสอบJSONสตริงโดยใช้ regexp และมันจะทำงานในกรณีส่วนใหญ่ไม่ใช่ทุกกรณี

ดูรอบเส้น 450 ในhttps://github.com/douglascrockford/JSON-js/blob/master/json2.js

มี regexp ที่ตรวจสอบ JSON ที่ถูกต้องคือ:

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

}

แก้ไข : json2.js รุ่นใหม่ทำให้การแยกวิเคราะห์ขั้นสูงกว่าข้างต้น แต่ยังคงอยู่บนพื้นฐานของการแทนที่ regexp (จากความคิดเห็นของ @Mrchief )


59
นี่เป็นเพียงการตรวจสอบว่ารหัสปลอดภัยสำหรับการใช้งานการประเมินหรือไม่ ตัวอย่างเช่นสตริงต่อไปนี้ '2011-6-27' จะผ่านการทดสอบนั้น
SystemicPlural

4
@SystemicPlural ใช่ แต่คำถามก็เกี่ยวกับการไม่ใช้ลอง / จับ
ไมค์

8
คุณไม่สามารถทดสอบว่าสตริงเป็น JSON ที่ถูกต้องกับ regex ใน JavaScript หรือไม่เนื่องจาก JS regexes ไม่สนับสนุนส่วนขยายที่จำเป็น (recursive regexes) ที่ให้คุณทำเช่นนั้น รหัสด้านบนของคุณล้มเหลวใน "{"
Venge

2
@Mic json2.js ไม่ใช้การตรวจสอบง่าย ๆ นั้นอีกต่อไป (แทนที่จะใช้การแยก 4 ขั้นตอนเพื่อพิจารณา JSON ที่ถูกต้อง) อยากจะแนะนำให้แก้ไขหรือลบคำตอบของคุณ โปรดทราบว่าฉันไม่คิดว่าจะมีความผิดใด ๆ กับ "ไม่มีการลอง / จับเป็นกลไก แต่เพียงผู้เดียวในการตรวจสอบ JSON" เป็นวิธีการ
Mrchief

8
เพียงเพราะมันช่วยเขาไม่ได้หมายความว่าจะช่วยพวกเราที่เหลือซึ่งปีต่อ ๆ ไปมีคำถามเดียวกัน
แมคเคย์

916

ใช้ตัวแยกวิเคราะห์ JSON เช่นJSON.parse:

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

7
ขอบคุณ แต่ฉันเพิ่งวิ่งเรื่องนี้กับทีมและพวกเขาต้องการบางสิ่งที่ไม่ใช้ลอง / จับ คำถามนี้ได้รับการแก้ไขพร้อมกับชื่อใหม่ ขอโทษด้วยกับเรื่องนั้น.
Chi Chan

4
@trejder: มันเป็นเพราะ 1 ไม่ใช่สตริงลองด้วย "1"
Purefan

31
@Gumbo ความคิดเห็นของฉันคือ 1,5 ปี! :] ฉันจำไม่ได้แล้วฉันกำลังทำอะไรเมื่อสองสัปดาห์ก่อนและคุณขอให้ฉันจำโครงการนั้นได้ :] ไม่ทาง ... :]
trejder

9
ปัญหาเกี่ยวกับคำตอบนี้คือถ้าสตริงตรวจสอบและคุณแยกวิเคราะห์คุณจะได้แยกวิเคราะห์สองครั้ง คุณไม่สามารถกลับเท็จในการแยกวิเคราะห์ที่ไม่ดี แต่กลับวัตถุในความสำเร็จ?
Carcigenicate

5
@Carcigenicate คุณสามารถทำได้ อย่างไรก็ตามJSON.parse("false")ประเมินเป็นเท็จเช่นกัน
Gumbo

445

ฉันรู้ว่าฉันมาสายคำถามนี้มา 3 ปีแล้ว แต่ฉันก็รู้สึกอยากตีระฆัง

ในขณะที่วิธีแก้ปัญหาของ Gumbo นั้นใช้งานได้ดี แต่ก็ไม่ได้จัดการกับบางกรณีที่ไม่มีข้อยกเว้นเกิดขึ้น JSON.parse({something that isn't JSON})

ฉันชอบที่จะส่งคืน JSON แยกวิเคราะห์ในเวลาเดียวกันดังนั้นรหัสการโทรไม่จำเป็นต้องโทรJSON.parse(jsonString)เป็นครั้งที่สอง

ดูเหมือนว่าจะทำงานได้ดีสำหรับความต้องการของฉัน:

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

9
จากคำตอบในหน้านี้มันมีประสิทธิภาพและน่าเชื่อถือที่สุด
Jonline

28
o && o !== nullฟุ่มเฟือย
Aleksei Matiushkin

4
ดังนั้นการใช้สามเท่ากับกับ typeof ซึ่งมักจะส่งกลับสตริง :)
Hein Haraldson Berg

5
แม้จะเป็นโพสต์เก่า แต่ฉันคิดว่ามันคุ้มค่าที่จะวางซอขึ้นเพื่อแสดงคำตอบของคุณ @matth โปรดทราบว่าวัตถุจะไม่ถูกต้อง .. คุณต้องผ่านสตริง JSON อาจมีประโยชน์สำหรับทุกคนที่เริ่มต้นฉันเดาว่า
MindVox

2
ฟังก์ชั่นควรกลับundefinedไม่ใช่falseเพราะfalseเป็นสตริง json ที่ถูกต้องและไม่มีทางแยกความแตกต่างระหว่างtryParseJSON("false")และtryParseJSON("garbage")
Sparebytes

54
// vanillaJS
function isJSON(str) {
    try {
        return (JSON.parse(str) && !!str);
    } catch (e) {
        return false;
    }
}

การใช้งาน: isJSON({})จะfalse, จะisJSON('{}')true

ในการตรวจสอบว่ามีบางอย่างเป็นArrayหรือObject( แยกวิเคราะห์ 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;

การใช้งาน: isAO({})จะtrue, จะisAO('{}')false


4
ระวังตั้งแต่nullผ่านการตรวจสอบนี้
Farzad YZ

2
return !!(JSON.parse(str) && str);ควรบล็อกค่าว่าง ฉันจะอัปเดตคำตอบด้วยรหัสนี้
Machado

1
นี่เป็นคำตอบที่ดีที่สุดเพราะช่วยให้คุณสามารถตรวจสอบว่า JSON คัดค้านหรือไม่และไม่ผ่านการparse()ทดสอบซึ่งเป็นสาเหตุของ WTF
not2qubit

30

นี่คือรหัสการทำงานของฉัน:

function IsJsonString(str) {
  try {
    var json = JSON.parse(str);
    return (typeof json === 'object');
  } catch (e) {
    return false;
  }
}

1
IsJsonString (null); // คืนค่าจริง สามารถแก้ไขได้โดยการเปรียบเทียบtypeof str === 'string'
gramcha

22

ฉันใช้วิธีที่ง่ายมากในการตรวจสอบสตริงว่า JSON นั้นถูกต้องหรือไม่

function testJSON(text){
    if (typeof text!=="string"){
        return false;
    }
    try{
        JSON.parse(text);
        return true;
    }
    catch (error){
        return false;
    }
}

ผลลัพธ์ที่มีสตริง JSON ที่ถูกต้อง:

var input='["foo","bar",{"foo":"bar"}]';
testJSON(input); // returns true;

ผลลัพธ์ด้วยสตริงอย่างง่าย

var input='This is not a JSON string.';
testJSON(input); // returns false;

ผลลัพธ์กับวัตถุ:

var input={};
testJSON(input); // returns false;

ผลลัพธ์ที่มีอินพุต Null:

var input=null;
testJSON(input); // returns false;

คนสุดท้ายส่งกลับเท็จเพราะประเภทของตัวแปร null เป็นวัตถุ

ใช้ได้ผลทุกครั้ง :)


1
JSON.parse (null), JSON.parse ("false") ไม่ส่งข้อผิดพลาดอาจมีตัวอย่างเพิ่มเติม
klodoma

ใช่คุณพูดถูกฉันลืมตรวจสอบว่าอินพุตเป็นสตริงหรือไม่ถ้าฉันทำอย่างนั้นวิธีนี้กับnullอินพุตจะให้ค่าเท็จ แต่อินพุต "false" เป็นสตริง JSON ที่ถูกต้อง boolean (false)นี้จะถูกแยกไป ตอนนี้ฉันแก้ไขรหัสเพื่อความแม่นยำมากขึ้น
kukko

15

ใน prototypeJS เรามีวิธีการisJSON คุณสามารถลอง แม้แต่jsonก็อาจช่วยได้

"something".isJSON();
// -> false
"\"something\"".isJSON();
// -> true
"{ foo: 42 }".isJSON();
// -> false
"{ \"foo\": 42 }".isJSON();

9
ขอบคุณ แต่ฉันคิดว่าการใช้ไลบรารี่ต้นแบบเพื่อทำสิ่งนี้นั้นเกินความจำเป็นเล็กน้อย
Chi Chan

4
คุณให้ตัวอย่างที่สี่ แต่มีเพียงสามผลลัพธ์ ผลลัพธ์"{ foo: 42 }".isJSON()คืออะไร ถ้าfalseอย่างที่ฉันคิด (ผลลัพธ์ควรตามฟังก์ชั่นมันเป็นเอกสาร) ดังนั้นคำถามที่ดีคือทำไมมันผิด? { foo: 42 }ดูเหมือนว่าจะเป็น JSON ที่ถูกต้องสมบูรณ์
trejder

4
@trejder น่าเสียดายที่ข้อมูลจำเพาะของ JSON นั้นต้องการคีย์
mikermcneil

4
และ "2002-12-15" .isJSON จะส่งกลับค่าจริงในขณะที่ JSON.parse ("2002-12-15") แสดงข้อผิดพลาด
ychaouche

4
ฉันคิดว่าคำตอบที่ดีกว่าคือดึงฟังก์ชั่นนั้นออกจากไลบรารีต้นแบบและวางไว้ที่นี่ โดยเฉพาะอย่างยิ่งตั้งแต่api.prototypejs.org/language/string/prototype/isjsonเป็น 404
jcollum

5

จากString.isJSONคำจำกัดความของกรอบต้นแบบที่นี่

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

ดังนั้นนี่คือรุ่นที่สามารถใช้ผ่านวัตถุสตริง

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


1
ใครมีชุดทดสอบเพื่อเปรียบเทียบคำตอบทั้งหมดเหล่านี้ ฉันต้องการดูว่าอันนี้ถูกต้องหรือไม่
Lonnie Best

1
@ LonnieBest เป็นจุดที่ดีที่สุด 2 เซนต์ของฉัน ฉันใช้เวลาหลายปีในการผลิตและมันก็ทำงานได้ดีและมีเวลาดำเนินการที่เหมาะสม
loretoparisi

4

คำตอบนี้เพื่อลดต้นทุนของคำสั่ง trycatch

ฉันใช้ JQuery เพื่อแยกสตริง JSON และฉันใช้คำสั่ง trycatch เพื่อจัดการข้อยกเว้น แต่การโยนข้อยกเว้นสำหรับสตริงที่ไม่สามารถแยกวิเคราะห์ได้ทำให้โค้ดของฉันช้าลงดังนั้นฉันจึงใช้ Regex ง่าย ๆ ในการตรวจสอบสตริงว่าเป็นสตริง JSON ที่เป็นไปได้หรือไม่ โดยตรวจสอบไวยากรณ์มันแล้วฉันใช้วิธีปกติโดยแยกสตริงโดยใช้ JQuery:

if (typeof jsonData == 'string') {
    if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) {
        return jsonData;
    }
}

try {
    jsonData = $.parseJSON(jsonData);
} catch (e) {

}

ฉันใส่โค้ดก่อนหน้าในฟังก์ชันเวียนเกิดเพื่อแยกการตอบสนอง JSON ที่ซ้อนกัน


jQuery ทำอะไรที่ JSON.parse () ไม่ทำอะไร?
ADJenks

3

อาจจะมีประโยชน์:

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

เอาท์พุท:

IE7: สตริง , วัตถุ, สตริง, สตริง

โครม: วัตถุวัตถุสตริงสตริง


2

ฉันคิดว่าฉันรู้ว่าทำไมคุณต้องการหลีกเลี่ยง แต่อาจลอง & catch! == ลองและจับ ; o) สิ่งนี้อยู่ในใจของฉัน:

var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

ดังนั้นคุณอาจคลิปสกปรกไปยังวัตถุ JSON เช่น:

JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

เนื่องจากสิ่งนี้ถูกห่อหุ้มไว้มากที่สุดจึงอาจไม่ผิดพลาด


2

นี่คือเวอร์ชัน typescript ด้วย:

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

typescript ไม่ใช่ javascript แต่คำตอบของคุณน่าจะเป็น
Lonnie Best


1

ฉันอนุมานจากความคิดเห็นในการเปิดว่ากรณีการใช้งานเป็นการวิเคราะห์ว่าคำตอบคือ HTML หรือ JSON ซึ่งในกรณีนี้เมื่อคุณทำรับ JSON คุณอาจควรจะแยกมันและการจัดการ JSON ที่ไม่ถูกต้องที่จุดในรหัสของคุณบางอยู่แล้ว นอกเหนือจากสิ่งใดฉันคิดว่าคุณต้องการรับทราบโดยเบราว์เซอร์ของคุณควรคาดว่า JSON แต่ได้รับ JSON ที่ไม่ถูกต้อง

การทำ regex แบบเต็มสำหรับ JSON นั้นไม่จำเป็นดังนั้น (ตามที่เป็น - ในประสบการณ์ของฉัน - สำหรับกรณีการใช้งานส่วนใหญ่) คุณน่าจะดีกว่าถ้าใช้สิ่งต่อไปนี้:

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

ที่ควรช่วยให้คุณไม่ต้องจัดการกับรหัสที่ไม่ใช่ JSON ที่ถูกต้องและดูแล duff json ในเวลาเดียวกัน


โซลูชันไฮบริดนี้ดูเหมือนว่าจะเป็นวิธีที่มีประสิทธิภาพในการหลีกเลี่ยงการลองใช้ในกรณีที่ไม่ใช่ JSON ส่วนใหญ่ ฉันชอบแนวทางของคุณ
Lonnie Best

1
if(resp) {
    try {
        resp = $.parseJSON(resp);
        console.log(resp);
    } catch(e) {
        alert(e);
    }
}

หวังว่าสิ่งนี้จะได้ผลกับคุณเช่นกัน


0
function get_json(txt)
{  var data

   try     {  data = eval('('+txt+')'); }
   catch(e){  data = false;             }

   return data;
}

หากมีข้อผิดพลาดส่งคืนเท็จ

หากไม่มีข้อผิดพลาดส่งคืนข้อมูล json


4
ในคำถาม: "การแก้ปัญหาไม่ควรมีลอง / จับ"
ddmps

1
ทำไม? นี่คือวิธีการรับประกัน ... จะโง่ที่จะเลิกใช้! ฉันขอโทษที่ไม่รู้ภาษาอังกฤษ ฉันใช้ Google Translate
Emrah Tuncel

น่าสนใจ ฉันต้องการดูการเปรียบเทียบประสิทธิภาพของ JSON.parse กับโซลูชันที่ใช้ eval นี้ แต่รูปลักษณ์นี้น่ากลัวจากมุมมองด้านความปลอดภัย / การฉีด
Lonnie Best

0

คุณสามารถใช้ฟังก์ชัน javascript eval ()เพื่อตรวจสอบว่ามันถูกต้อง

เช่น

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
}

หรือคุณสามารถใช้JSON.parseฟังก์ชั่นจากjson.org :

try {
  json = JSON.parse(jsonString);
} catch (exception) {
  json = null;
}

if (json) {
  //this is json
}

หวังว่านี่จะช่วยได้

คำเตือน : eval()เป็นอันตรายหากมีคนเพิ่มรหัส JS ที่เป็นอันตรายเนื่องจากมันจะดำเนินการ ตรวจสอบให้แน่ใจว่า JSON String นั้นเชื่อถือได้เช่นคุณได้มาจากแหล่งที่เชื่อถือได้

แก้ไขสำหรับวิธีที่ 1 ของฉันขอแนะนำให้ทำเช่นนี้

 try {
      json = eval("{" + jsonString + "}");
    } catch (exception) {
      //It's advisable to always catch an exception since eval() is a javascript executor...
      json = null;
    }

เพื่อรับประกัน json-ness หากjsonStringJSON ไม่บริสุทธิ์ eval จะส่งข้อยกเว้น


ตัวอย่างแรกที่ใช้ eval บอกว่า "<div> foo </div>" เป็น JSON ที่ถูกต้อง มันอาจทำงานแตกต่างกันในเบราว์เซอร์ที่แตกต่างกัน แต่ปรากฏว่าใน FireFox, eval () ยอมรับ XML
Mark Lutton

ขอบคุณ แต่ฉันเพิ่งวิ่งเรื่องนี้กับทีมและพวกเขาต้องการบางสิ่งที่ไม่ใช้ลอง / จับ คำถามนี้ได้รับการแก้ไขพร้อมกับชื่อใหม่ ขอโทษด้วยกับเรื่องนั้น.
Chi Chan

@ Mark Lutton ประเภทของวัตถุจะไม่เป็นของ JSON แต่เป็นของเอกสาร XML Dom (ฉันลืมว่าประเภทที่แน่นอนใน firefox คืออะไร)
Buhake Sindi

1
eval ยังยอมรับ JavaScript ที่ถูกต้องเช่น "alert (5);" และสตริงในเครื่องหมายคำพูดเดี่ยวซึ่งไม่ถูกต้อง JSON
Mark Lutton

12
นี่คือหลักฐานบริสุทธิ์
Chris Baker

0

โอ้คุณสามารถลองลองใช้เพื่อตรวจสอบว่าเป็น JSON ที่ถูกต้องหรือไม่

ทดสอบกับ Firfox Quantom 60.0.1

ใช้ฟังก์ชั่นภายในฟังก์ชั่นเพื่อรับการทดสอบ JSON และใช้เอาต์พุตนั้นเพื่อตรวจสอบความถูกต้องของสตริง ได้ยินตัวอย่าง

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

0

ฟังก์ชั่นIsJsonString(str)ที่ใช้JSON.parse(str)ไม่ทำงานในกรณีของฉัน
ฉันพยายามตรวจสอบ json output จากGraphiQLมันจะคืนค่า false เสมอ โชคดีฉันisJSONทำงานได้ดีขึ้น:

var test = false;

$('body').on('DOMSubtreeModified', '.resultWrap', function() {

    if (!test) {   
        var resultWrap = "{" + $('#graphiql .resultWrap').text().split("{").pop();
        if isJSON(resultWrap) {test = !test;}
        console.log(resultWrap); 
        console.log(resultWrap.isJSON());
    }

});

ตัวอย่างผลลัพธ์:

THREE.WebGLRenderer 79
draw.js:170 {xxxxxxxxxx
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}
draw.js:170 true

0

สำหรับคนที่ชอบการประชุมแบบ. net ของ "ลอง" ฟังก์ชั่นที่ส่งกลับค่าบูลีนและจัดการกับพารามิเตอร์ไบต์ที่มีผลลัพธ์ หากคุณไม่ต้องการพารามิเตอร์ out คุณสามารถละเว้นมันได้และใช้ค่าส่งคืน

StringTests.js

  var obj1 = {};
  var bool1 = '{"h":"happy"}'.tryParse(obj1); // false
  var obj2 = {};
  var bool2 = '2114509 GOODLUCKBUDDY 315852'.tryParse(obj2);  // false

  var obj3 = {};
  if('{"house_number":"1","road":"Mauchly","city":"Irvine","county":"Orange County","state":"California","postcode":"92618","country":"United States of America","country_code":"us"}'.tryParse(obj3))
    console.log(obj3);

StringUtils.js

String.prototype.tryParse = function(jsonObject) {
  jsonObject = jsonObject || {};
  try {
    if(!/^[\[{]/.test(this) || !/[}\]]$/.test(this)) // begin / end with [] or {}
      return false; // avoid error handling for strings that obviously aren't json
    var json = JSON.parse(this);
    if(typeof json === 'object'){
      jsonObject.merge(json);
      return true;
    }
  } catch (e) {
    return false;
  }
}

ObjectUtils.js

Object.defineProperty(Object.prototype, 'merge', {
  value: function(mergeObj){
    for (var propertyName in mergeObj) {
      if (mergeObj.hasOwnProperty(propertyName)) {
        this[propertyName] = mergeObj[propertyName];
      }      
    }
    return this;
  },
  enumerable: false, // this is actually the default
});

-1

โค้ดหนึ่งซับง่ายมาก (แต่ใช้วิธีแฮ็ค)

if (expected_json.id === undefined){
   // not a json
}
else{
   // json
}

หมายเหตุ: ใช้งานได้เฉพาะเมื่อคุณคาดหวังว่าบางสิ่งบางอย่างเป็นสตริง JSON เช่น id ฉันใช้มันสำหรับ API และคาดหวังผลลัพธ์ใน JSON หรือสตริงข้อผิดพลาดบางอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.