Làm thế nào để kiểm tra xem một chuỗi có phải là JSON hay không?


191

Tôi có một cuộc gọi AJAX đơn giản và máy chủ sẽ trả về một chuỗi JSON có dữ liệu hữu ích hoặc chuỗi thông báo lỗi do hàm PHP tạo ra mysql_error() . Làm cách nào để kiểm tra xem dữ liệu này là chuỗi JSON hay thông báo lỗi.

Sẽ thật tuyệt khi sử dụng một chức năng được gọi isJSONlà giống như bạn có thể sử dụng chức nănginstanceof để kiểm tra xem có thứ gì đó là Mảng không.

Đây là những gì tôi muốn:

if (isJSON(data)){
    //do some data stuff
}else{
    //report the error
    alert(data);
}

Có thể sử dụng eval()nếu nó trả về undefinedsau đó, nó không phải là JSON
MatuDuke

4
Điều này đã được giải quyết ở đây: stackoverflow.com/questions/3710204/ từ
Tái lập

2
Cảm ơn mọi người, xin lỗi tôi đã không tìm thấy bài viết khác trước đó.
jeffery_the_wind

1
Về mặt kỹ thuật, đây không phải là bản sao của 3710204 vì người ta hỏi liệu nó có hợp lệ không, đó là một thanh cao hơn nhiều để vượt qua so với nó không phải là json.
carlin.scott

Câu trả lời:


319

Sử dụng JSON.parse

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

53
Xử lý ngoại lệ không nên được sử dụng để làm một cái gì đó mong đợi.
luisZavaleta

44
JSON.parse(1234)HAY JSON.parse(0)HAY JSON.parse(false)HAY JSON.parse(null)tất cả sẽ không tăng ngoại lệ và sẽ trở thành sự thật !!. không sử dụng câu trả lời này
Zalaboza

19
@Zalaboza 1234, 0, false, và nulllà tất cả các giá trị JSON hợp lệ. Nếu bạn muốn một vị từ kiểm tra xem JSON có đại diện cho một đối tượng bạn sẽ cần làm thêm một chút không.
Michael Lang

20
JSON.parsethực hiện nhiều tính toán để phân tích chuỗi và cung cấp cho bạn đối tượng json nếu nó thành công, nhưng bạn đang loại bỏ kết quả mà một số người dùng có thể muốn sử dụng. Điều đó dường như không tốt. Tôi thay vào đó return {value: JSON.parse(str), valid: true};và trong khối bắt return {value: str, valid: false};.. và tôi sẽ đổi tên hàm thành tryParse().
Nawaz

7
@luisZavaleta thì bạn đề xuất phương pháp gì
PirateApp

80

Mã này là JSON.parse(1234)hay JSON.parse(0)hay JSON.parse(false)hay JSON.parse(null)tất cả sẽ trở thành sự thật.

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

Vì vậy, tôi viết lại mã theo cách này:

function isJson(item) {
    item = typeof item !== "string"
        ? JSON.stringify(item)
        : item;

    try {
        item = JSON.parse(item);
    } catch (e) {
        return false;
    }

    if (typeof item === "object" && item !== null) {
        return true;
    }

    return false;
}

Kết quả kiểm tra:

kết quả kiểm tra isJson


4
Công việc tốt đẹp! Câu lệnh if cuối cùng của bạn có thể được đơn giản hóa thành câu lệnh hoàn trả đơn giản, chẳng hạn như:return (typeof suspect === "object" && suspect !== null);
Nebulosar

37

Hãy tóm tắt lại điều này (cho năm 2019+).

Lập luận : giá trị như true, false, nullcó giá trị JSON (?)

SỰ THẬT : Các giá trị nguyên thủy này có thể phân tích cú pháp JSON nhưng chúng không phải là cấu trúc JSON được hình thành tốt . Đặc tả JSON chỉ ra JSON được xây dựng trên hai cấu trúc: Một tập hợp các cặp tên / giá trị (đối tượng) hoặc một danh sách các giá trị (mảng) được sắp xếp theo thứ tự.

Luận điểm : Xử lý ngoại lệ không nên được sử dụng để làm điều gì đó được mong đợi.
(Đây là một nhận xét có hơn 25 lượt upvote!)

SỰ THẬT : Không! Sử dụng thử / bắt chắc chắn là hợp pháp, đặc biệt trong trường hợp như thế này. Mặt khác, bạn cần thực hiện nhiều công cụ phân tích chuỗi như các hoạt động tokenizing / regex; trong đó sẽ có hiệu suất khủng khiếp.

hasJsonStructure()

Điều này hữu ích nếu mục tiêu của bạn là kiểm tra xem một số dữ liệu / văn bản có định dạng trao đổi JSON phù hợp hay không.

function hasJsonStructure(str) {
    if (typeof str !== 'string') return false;
    try {
        const result = JSON.parse(str);
        const type = Object.prototype.toString.call(result);
        return type === '[object Object]' 
            || type === '[object Array]';
    } catch (err) {
        return false;
    }
}

Sử dụng:

hasJsonStructure('true')             // —» false
hasJsonStructure('{"x":true}')       // —» true
hasJsonStructure('[1, false, null]') // —» true

safeJsonParse()

Và điều này rất hữu ích nếu bạn muốn cẩn thận khi phân tích một số dữ liệu thành giá trị JavaScript.

function safeJsonParse(str) {
    try {
        return [null, JSON.parse(str)];
    } catch (err) {
        return [err];
    }
}

Sử dụng:

const [err, result] = safeJsonParse('[Invalid JSON}');
if (err) {
    console.log('Failed to parse JSON: ' + err.message);
} else {
    console.log(result);
}

1
Bạn liên kết đến Spec Spec nói như sau: "Văn bản JSON là một chuỗi các mã thông báo được hình thành từ các điểm mã Unicode phù hợp với ngữ pháp giá trị JSON." và "Giá trị JSON có thể là một đối tượng, mảng, số, chuỗi, true, false hoặc null." - Làm thế nào bạn đi đến kết luận rằng JSON chỉ có thể là đối tượng hoặc mảng ở cấp gốc? Tôi không thể thấy điều này trong thông số kỹ thuật, cũng như bất cứ điều gì liên quan đến "các cấu trúc JSON được hình thành tốt"
Relequestual

Đọc đoạn thứ hai bắt đầu bằng "JSON được xây dựng trên hai cấu trúc ..." @ json.org hoặc đoạn thứ 4 và 5 của ecma
Onur Yıldırım

json.org chỉ là thông tin. Đọc thông số kỹ thuật bạn liên kết đến không hỗ trợ đề xuất của bạn. Thông số kỹ thuật đề cập RFC 8259 là RFC mới nhất. Hãy xem các ví dụ về các tex JSON hợp lệ chỉ chứa các giá trị tools.ietf.org/html/rfc8259#section-13 - RFC 8259 được thiết kế để giải quyết sự mơ hồ và nhầm lẫn có thể xảy ra, giống như thế này.
Tương đối

Đọc câu trả lời một lần nữa. Tôi đang nói các giá trị như nguyên thủy (tức là giá trị văn bản trong các ví dụ RFC) không phải là "cấu trúc" JSON. Không có sự mơ hồ. Bạn CÓ THỂ phân tích chúng dưới dạng JSON, nó hợp lệ để làm như vậy. Nhưng chúng không phải là dữ liệu có cấu trúc. JSON chủ yếu được phát minh dưới dạng định dạng trao đổi »được sử dụng cho dữ liệu có cấu trúc» có thể là một đối tượng hoặc mảng.
Onur Yıldırım

1
OK, vì vậy tôi nghĩ rằng chúng tôi đồng ý. Các nguyên hàm là JSON hợp lệ theo đặc tả, nhưng không phải là "cấu trúc". Tốt rồi. Nhưng, bạn đã nói "Đối số: Các giá trị như đúng, sai, null là JSON hợp lệ (?). Sự thật: Có và không!" - Thực tế là JSON hợp lệ theo thông số kỹ thuật. Ý kiến ​​về việc chúng có hữu ích hay không không liên quan đến thực tế đó.
Tương đối

20

Nếu máy chủ đang phản hồi với JSON thì nó sẽ có kiểu application/jsonnội dung, nếu nó phản hồi bằng một tin nhắn văn bản đơn giản thì nó phải có kiểu text/plainnội dung. Đảm bảo rằng máy chủ đang phản hồi với loại nội dung chính xác và kiểm tra điều đó.


4
Điều này là sai, có rất nhiều mediaty tương thích json khác. Hơn nữa overrideMimeTypecó thể ghi đè tiêu đề loại nội dung.
Knu

13

Khi sử dụng jQuery $.ajax()phản hồi sẽ có thuộc responseJSONtính nếu phản hồi là JSON, điều này có thể được kiểm tra như sau:

if (xhr.hasOwnProperty('responseJSON')) {}

2
Đây là điều tôi nghi ngờ thực sự là câu trả lời mà hầu hết mọi người đang tìm kiếm, thậm chí có thể là OP
Kirby

Điều này thanh lịch hơn nhiều so với việc sử dụng khối thử bắt
Anurag Sinha

6

Tôi thích câu trả lời hay nhất nhưng nếu đó là một chuỗi rỗng thì nó trả về đúng. Vì vậy, đây là một sửa chữa:

function isJSON(MyTestStr){
    try {
        var MyJSON = JSON.stringify(MyTestStr);
        var json = JSON.parse(MyJSON);
        if(typeof(MyTestStr) == 'string')
            if(MyTestStr.length == 0)
                return false;
    }
    catch(e){
        return false;
    }
    return true;
}

var json không được sử dụng? Hay chỉ để bắt lỗi?
stackdave

5
var parsedData;

try {
    parsedData = JSON.parse(data)
} catch (e) {
    // is not a valid JSON string
}

Tuy nhiên, tôi sẽ đề xuất với bạn rằng cuộc gọi / dịch vụ http của bạn sẽ luôn trả về một dữ liệu có cùng định dạng. Vì vậy, nếu bạn gặp lỗi, hơn bạn nên có một đối tượng JSON bao bọc lỗi này:

{"error" : { "code" : 123, "message" : "Foo not supported" } } 

Và có thể sử dụng trạng thái HTTP cũng như mã 5xx.


5

Chà ... Nó phụ thuộc vào cách bạn đang nhận dữ liệu của mình. Tôi nghĩ rằng máy chủ đang phản hồi với một chuỗi được tạo thành JSON (sử dụng json_encode () trong PHP, vd). Nếu bạn đang sử dụng bài đăng JQuery và đặt dữ liệu phản hồi thành định dạng JSON và đó là JSON không đúng định dạng, điều này sẽ gây ra lỗi:

$.ajax({
  type: 'POST',
  url: 'test2.php',
  data: "data",
  success: function (response){

        //Supposing x is a JSON property...
        alert(response.x);

  },
  dataType: 'json',
  //Invalid JSON
  error: function (){ alert("error!"); }
});

Nhưng, nếu bạn đang sử dụng kiểu phản hồi dưới dạng văn bản, bạn cần sử dụng $ .parseJSON. Theo trang jquery: "Truyền chuỗi JSON không đúng định dạng có thể dẫn đến ngoại lệ bị ném". Do đó, mã của bạn sẽ là:

$.ajax({
  type: 'POST',
  url: 'test2.php',
  data: "data",
  success: function (response){

        try {
            parsedData = JSON.parse(response);
        } catch (e) {
            // is not a valid JSON string
        }

  },
  dataType: 'text',
});

trừ khi, tất nhiên, bạn đang cố phân tích văn bản lỗi trong hàm lỗi trong ví dụ trên và không chắc đó có phải là JSON không ...
Kirby

Câu trả lời tuyệt vời, mặc dù nếu responsetrống, nó sẽ chuyển đến success: '(
Henrik Petterson

4

Có thể có các bài kiểm tra bạn có thể làm, ví dụ nếu bạn biết rằng JSON được trả về sẽ luôn được bao quanh {}sau đó bạn có thể kiểm tra các ký tự đó hoặc một số phương thức hack khác. Hoặc bạn có thể sử dụng json.org thư viện JS để thử và phân tích nó và kiểm tra nếu nó thành công.

Tuy nhiên tôi sẽ đề nghị một cách tiếp cận khác. Tập lệnh PHP của bạn hiện trả về JSON nếu cuộc gọi thành công, nhưng một số thứ khác nếu không. Tại sao không luôn luôn trả về JSON?

Ví dụ

Cuộc gọi thành công:

{ "status": "success", "data": [ <your data here> ] }

Cuộc gọi đáng ghét:

{ "status": "error", "error": "Database not found" }

Điều này sẽ làm cho việc viết JS phía máy khách của bạn dễ dàng hơn nhiều - tất cả những gì bạn phải làm là kiểm tra thành viên "trạng thái" và hành động tương ứng.


4

Tôi chỉ sử dụng 2 dòng để thực hiện điều đó:

var isValidJSON = true;
try { JSON.parse(jsonString) } catch { isValidJSON = false }

Đó là tất cả!

Nhưng hãy nhớ rằng có 2 bẫy:
1. JSON.parse(null)trả về null
2. Bất kỳ số hoặc chuỗi nào có thể được phân tích cú pháp bằng JSON.parse()phương thức.
   JSON.parse("5")trả 5
   JSON.parse(5)về5

Hãy chơi một số mã:

// TEST 1
var data = '{ "a": 1 }'

// Avoiding 'null' trap! Null is confirmed as JSON.
var isValidJSON = data ? true : false
try { JSON.parse(data) } catch(e) { isValidJSON = false }

console.log("data isValidJSON: ", isValidJSON);
console.log("data isJSONArray: ", isValidJSON && JSON.parse(data).length ? true : false);

Console outputs:
data isValidJSON:  true
data isJSONArray:  false


// TEST 2
var data2 = '[{ "b": 2 }]'

var isValidJSON = data ? true : false
try { JSON.parse(data2) } catch(e) { isValidJSON = false }

console.log("data2 isValidJSON: ", isValidJSON);
console.log("data2 isJSONArray: ", isValidJSON && JSON.parse(data2).length ? true : false);

Console outputs:
data2 isValidJSON:  true
data2 isJSONArray:  true


// TEST 3
var data3 = '[{ 2 }]'

var isValidJSON = data ? true : false
try { JSON.parse(data3) } catch(e) { isValidJSON = false }

console.log("data3 isValidJSON: ", isValidJSON);
console.log("data3 isJSONArray: ", isValidJSON && JSON.parse(data3).length ? true : false);

Console outputs:
data3 isValidJSON:  false
data3 isJSONArray:  false


// TEST 4
var data4 = '2'

var isValidJSON = data ? true : false
try { JSON.parse(data4) } catch(e) { isValidJSON = false }

console.log("data4 isValidJSON: ", isValidJSON);
console.log("data4 isJSONArray: ", isValidJSON && JSON.parse(data4).length ? true : false);


Console outputs:
data4 isValidJSON:  true
data4 isJSONArray:  false


// TEST 5
var data5 = ''

var isValidJSON = data ? true : false
try { JSON.parse(data5) } catch(e) { isValidJSON = false }

console.log("data5 isValidJSON: ", isValidJSON);
console.log("data5 isJSONArray: ", isValidJSON && JSON.parse(data5).length ? true : false);


Console outputs:
data5 isValidJSON:  false
data5 isJSONArray:  false

// TEST 6
var data6; // undefined

var isValidJSON = data ? true : false
try { JSON.parse(data6) } catch(e) { isValidJSON = false }

console.log("data6 isValidJSON: ", isValidJSON);
console.log("data6 isJSONArray: ", isValidJSON && JSON.parse(data6).length ? true : false);

Console outputs:
data6 isValidJSON:  false
data6 isJSONArray:  false

Tôi đã tạo một câu đố cho câu trả lời này tại jsfiddle.net/fatmonk/gpn4eyav , trong đó bao gồm tùy chọn thêm dữ liệu kiểm tra người dùng của riêng bạn. Điều này trông giống như cơ sở của một chức năng thư viện tốt đối với tôi, nhưng tôi muốn hiểu thêm về lý do tại sao Kiểm tra 1 không phải là một mảng JSON hợp lệ.
Fat Monk

Bởi vì một mảng phải được chỉ định bằng cách sử dụng []. Ví dụ, [1, 2, 3]là một mảng số. ["a", "b", "c"]là một chuỗi chuỗi. Và [{"a":1}, {"b":2}]là một mảng JSON. Công việc jsfiddle của bạn có vẻ thực sự hữu ích!
efkan

Đơn giản vậy thôi?! Vì vậy, Test 1 là một đối tượng JSON và Test 2 là một mảng JSON bao gồm một thành phần đối tượng JSON duy nhất. Tôi đã hiểu đúng chưa?
Fat Monk

Câu hỏi được gắn cờ là một bản sao có thể có của câu hỏi này ( stackoverflow.com/questions/3710204/ ( )) hỏi về việc đạt được điều này mà không cần sử dụng thử / bắt vì vậy tôi đã bỏ qua câu đố của mình để cố gắng đạt được mục tiêu đó. Cái ngã ba có tại jsfiddle.net/fatmonk/827jsuvr và hoạt động với tất cả các bài kiểm tra ở trên, ngoại trừ Bài kiểm tra 3 có lỗi tại JSON.parse. Bất cứ ai có thể tư vấn làm thế nào để tránh lỗi đó mà không cần sử dụng thử?
Fat Monk

jsfiddleỨng dụng của bạn đưa ra lỗi vì Bài kiểm tra 3 không có biểu thức JSON hợp lệ. Vì vậy, try-catchphải sử dụng để bắt lỗi đó và để đánh giá bất kỳ lỗi nào vì biểu thức không phải là JSON khi phân tích cú pháp như Kiểm tra 3 ở trên:try { JSON.parse(data3) } catch(e) { isValidJSON = false }
efkan

2

Bạn có thể thử giải mã nó và bắt ngoại lệ (nguyên gốc hoặc json2.js ):

try {
  newObj = JSON.parse(myJsonString);
} catch (e) {
  console.log('Not JSON');
}

Tuy nhiên, tôi sẽ đề nghị làm cho phản hồi luôn là JSON hợp lệ. Nếu bạn gặp lỗi từ truy vấn MySQL của mình, chỉ cần gửi lại JSON với lỗi:

{"error":"The MySQL error string."}

Và sau đó:

if (myParsedJSON.error) {
  console.log('An error occurred: ' + myParsedJSON.error);
}

2

Cảnh báo: Đối với các phương thức dựa vào JSON.parse- Mảng và trích dẫn các chuỗi được bao quanh cũng sẽ vượt qua (ví dụ. console.log(JSON.parse('[3]'), JSON.parse('"\uD800"')))

Để tránh tất cả các nguyên hàm JSON không phải đối tượng (boolean, null, mảng, số, chuỗi), tôi khuyên bạn nên sử dụng như sau:

/* Validate a possible object ie. o = { "a": 2 } */
const isJSONObject = (o) => 
  !!o && (typeof o === 'object') && !Array.isArray(o) && 
  (() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()

/* Validate a possible JSON object represented as string ie. s = '{ "a": 3 }' */
function isJSONObjectString(s) {
    try {
        const o = JSON.parse(s);
        return !!o && (typeof o === 'object') && !Array.isArray(o)
    } catch {
        return false
    }
}

Giải thích mã

  • !! o - Không giả mạo (không bao gồm null, đăng ký dưới dạng typeof 'object')
  • (typeof o === 'object') - Không bao gồm boolean, số và chuỗi
  • ! Array.isArray (o) - Loại trừ các mảng (đăng ký dưới dạng typeof 'object')
  • thử ... JSON.opesify / JSON.parse - Yêu cầu công cụ JavaScript để xác định xem JSON hợp lệ

Tại sao không sử dụng câu trả lời hasJsonStr struct ()?

Dựa vào toString()không phải là một ý tưởng tốt. Điều này là do các Công cụ JavaScript khác nhau có thể trả về một đại diện chuỗi khác nhau. Nói chung, các phương pháp dựa vào điều này có thể thất bại trong các môi trường khác nhau hoặc có thể bị lỗi sau này nếu động cơ thay đổi kết quả chuỗi

Tại sao bắt một ngoại lệ không phải là hack?

Nó đã được đưa ra rằng bắt một ngoại lệ để xác định tính hợp lệ của một cái gì đó không bao giờ là cách đúng đắn. Đây thường là lời khuyên tốt, nhưng không phải lúc nào cũng vậy. Trong trường hợp này, việc bắt ngoại lệ có khả năng là con đường tốt nhất vì nó phụ thuộc vào việc triển khai xác thực dữ liệu JSON của công cụ JavaScript.

Dựa vào công cụ JS cung cấp các lợi thế sau:

  1. Cẩn thận hơn và liên tục cập nhật hơn khi thông số JSON thay đổi
  2. Có khả năng chạy nhanh hơn (vì nó là mã cấp thấp hơn)

Khi có cơ hội dựa vào công cụ JavaScript, tôi khuyên bạn nên làm điều đó. Đặc biệt là như vậy trong trường hợp này. Mặc dù có thể cảm thấy khó khăn khi bắt ngoại lệ, bạn thực sự chỉ cần xử lý hai trạng thái trả về có thể có từ một phương thức bên ngoài.


1

Đây là một mã với một số sửa đổi nhỏ trong câu trả lời của Bourne. Vì JSON.parse (số) hoạt động tốt mà không có ngoại lệ nên đã thêm isNaN.

function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return isNaN(str);
}

0

Tất cả các chuỗi json bắt đầu bằng '{' hoặc '[' và kết thúc bằng '}' hoặc ']' tương ứng, vì vậy chỉ cần kiểm tra điều đó.

Đây là cách Angular.js thực hiện:

var JSON_START = /^\[|^\{(?!\{)/;
var JSON_ENDS = {
  '[': /]$/,
  '{': /}$/
};

function isJsonLike(str) {
    var jsonStart = str.match(JSON_START);
    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);
}

https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js


@DukeDougal quan tâm làm rõ? Đôi khi mọi người bắt đầu json của họ bằng '[' nhưng điều đó không phổ biến lắm.
carlin.scott

1
Bạn cần phân tích cú pháp để làm việc với nó là JSON hợp lệ. Nếu đó là JSON không hợp lệ thì đó không phải là JSON. Câu hỏi là "làm thế nào để biết một chuỗi có phải là JSON hay không?". Theo cách tiếp cận của bạn, đây sẽ là JSON {fibble - và nó thực sự không phải là JSON. Cũng xem xét các trường hợp như số 1 của chính nó - đó là JSON hợp lệ.
Công tước Dougal

1
"Nếu đó là JSON không hợp lệ thì đó không phải là JSON". Việc bạn phải sử dụng từ "hợp lệ" cho thấy rằng bạn đang bổ sung một phẩm chất cho thực tế rằng nó không chỉ là json. Câu hỏi chỉ đơn giản là "nó là json" và ví dụ mã của tôi trả lời câu hỏi đó một cách hoàn hảo mà không cần giả định các yêu cầu bổ sung.
carlin.scott

ý tưởng tồi nếu bạn đang sử dụng một số hệ thống mẫu và bạn có một cái gì đó giống như { someValue }sẽ tự động vượt qua xác nhận.
ncubica

@ncubica vì vậy, bạn đang sử dụng một mẫu cho một cái gì đó không phải là json, chuỗi chỉ chứa một trình giữ chỗ sử dụng dấu ngoặc nhọn và công cụ mẫu không thể thay thế trình giữ chỗ bằng giá trị thực? Ngoài ra, hãy nhớ rằng, như tôi đã giải thích với Duke, câu hỏi ban đầu không đề cập đến xác nhận. Họ chỉ muốn biết nó có giống json hay không.
carlin.scott

0

Tôi đề nghị trong chế độ Bản in:

export function stringify(data: any): string {
    try {
         return JSON.stringify(data)
    } catch (e) {
         return 'NOT_STRINGIFIABLE!'
    }
}

0

Tôi đã sử dụng câu hỏi này (loại kết hợp các câu trả lời khác nhau, nhưng dù sao):

const isJSON = str => {
  if (typeof str === 'string'){
    try {
      JSON.parse(str)
      return true
    } catch(e){
    }
  }
  return false
}



[null, undefined, false, true, [], {}, 
 '', 'asdf', '{}', '[]', "{\"abc\": 2}","{\"abc\": \"2\"}"]
  .map(el => {
      console.log(`[>${el}<] - ${isJSON(el)}`)
})

console.log('-----------------')


0

Bạn có thể thử câu sau vì nó cũng xác nhận số, null, chuỗi nhưng câu trả lời được đánh dấu ở trên không hoạt động chính xác, đó chỉ là một sửa chữa của hàm trên:

function isJson(str) {
  try {
      const obj = JSON.parse(str);
      if (obj && typeof obj === `object`) {
        return true;
      }
    } catch (err) {
      return false;
    }
   return false;
}

-1

Ngoài các câu trả lời trước, trong trường hợp bạn cần xác thực định dạng JSON như "{}", bạn có thể sử dụng mã sau:

const validateJSON = (str) => {
  try {
    const json = JSON.parse(str);
    if (Object.prototype.toString.call(json).slice(8,-1) !== 'Object') {
      return false;
    }
  } catch (e) {
    return false;
  }
  return true;
}

Ví dụ về việc sử dụng:

validateJSON('{}')
true
validateJSON('[]')
false
validateJSON('')
false
validateJSON('2134')
false
validateJSON('{ "Id": 1, "Name": "Coke" }')
true
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.