Câu hỏi Phân tích cú pháp JSON trong JavaScript? [bản sao]


Câu hỏi này đã có câu trả lời ở đây:

Tôi muốn phân tích một chuỗi JSON trong JavaScript. Câu trả lời là một cái gì đó như

var response = '{"result":true,"count":1}';

Làm thế nào tôi có thể nhận được các giá trị result và count từ đây?


1515
2018-02-08 16:34


gốc


var json = '{"result": true, "count": 1}', obj = JSON.parse (json); console.log (obj.count); // nếu sử dụng trong nodejs thì hãy sử dụng giao diện điều khiển - Shekhar Tyagi


Các câu trả lời:


Hầu hết các trình duyệt đều hỗ trợ JSON.parse(), được định nghĩa trong ECMA-262 5th Edition (đặc tả dựa trên JavaScript). Cách sử dụng của nó rất đơn giản:

var json = '{"result":true,"count":1}',
    obj = JSON.parse(json);

alert(obj.count);

Đối với các trình duyệt không bạn có thể triển khai bằng trình duyệt json2.js.

Như đã lưu ý trong các ý kiến, nếu bạn đã sử dụng jQuery, có một $.parseJSON chức năng ánh xạ tới JSON.parse nếu có hoặc một hình thức eval trong các trình duyệt cũ hơn. Tuy nhiên, điều này thực hiện các kiểm tra bổ sung, không cần thiết cũng được thực hiện bởi JSON.parse, do đó, để có hiệu suất tốt nhất, tôi khuyên bạn nên sử dụng nó như sau:

var json = '{"result":true,"count":1}',
    obj = JSON && JSON.parse(json) || $.parseJSON(json);

Điều này sẽ đảm bảo bạn sử dụng nguyên gốc JSON.parse ngay lập tức, thay vì có jQuery thực hiện kiểm tra sanity trên chuỗi trước khi chuyển nó đến hàm phân tích gốc.


1868
2018-02-08 16:38



@Marwan: IE 8+ hỗ trợ JSON.parse(). Đối với IE 6, 7 và các trình duyệt cũ hơn, bạn có thể sử dụng json2.js mà tôi đã liên kết từ bài đăng của tôi. Ngoài ra, nhưng ít an toàn hơn, bạn có thể sử dụng eval. - Andy E
Trừ khi anh ta cũng cần JSON.stringify() - ThiefMaster♦
Lưu ý cho người đánh giá: vui lòng kiểm tra kỹ lưỡng các chỉnh sửa ngang hàng trước khi cho phép chúng, vì hành động của bạn có thể gây ra các tác dụng phụ không mong muốn cho người dùng sao chép và dán mã từ câu trả lời. - Andy E
Nó không cần thiết để kiểm tra hỗ trợ bản địa đầu tiên và sau đó rơi trở lại jQuery. jQuery 1.10 cố gắng JSON.parse đầu tiên, sau đó thực hiện riêng. jQuery 2.x đang gọi trực tiếp JSON.parse mà không kiểm tra hoặc dự phòng. - Jasha
Chi tiết hỗ trợ trình duyệt: Tôi có thể sử dụng phân tích cú pháp JSON không - Peter V. Mørch


Trước hết, bạn phải đảm bảo rằng mã JSON là hợp lệ.

Sau đó, tôi khuyên bạn nên sử dụng một thư viện JavaScript như jQuery hoặc Prototype nếu bạn có thể vì những thứ này được xử lý tốt trong các thư viện đó.

Mặt khác, nếu bạn không muốn sử dụng một thư viện và bạn có thể xác nhận tính hợp lệ của đối tượng JSON, tôi chỉ cần bọc chuỗi trong một hàm ẩn danh và sử dụng hàm eval.

Điều này không được khuyến khích nếu bạn nhận được đối tượng JSON từ một nguồn khác không hoàn toàn đáng tin cậy vì hàm eval cho phép mã renegade nếu bạn muốn.

Đây là một ví dụ về việc sử dụng hàm eval:

var strJSON = '{"result":true,"count":1}';
var objJSON = eval("(function(){return " + strJSON + ";})()");
alert(objJSON.result);
alert(objJSON.count);

Nếu bạn kiểm soát trình duyệt nào đang được sử dụng hoặc bạn không lo lắng mọi người với trình duyệt cũ hơn, bạn luôn có thể sử dụng phương thức JSON.parse.

Đây thực sự là giải pháp lý tưởng cho tương lai.


91
2018-02-08 16:46



Người đàn ông tuyệt vời! Tôi không thể nhập khẩu JSON JSON, bởi vì nó xung đột với các libs khác - Tahir Malik
eval () là OK để hoàn thành một công việc, trong khi nó có thể biên dịch và thực thi bất kỳ chương trình Javascript nào, vì vậy có thể có Vân đê bảo mật. Tôi nghĩ JSON.parse () là một lựa chọn tốt hơn. - ray6080
Lưu ý cho người qua đường: đây là một công cụ trực tuyến tốt để kiểm tra xem chuỗi JSON của bạn có hợp lệ không: jsonlint.com - Amal Murali
KHÔNG KHÔNG KHÔNG!!! Sử dụng eval để đánh giá JSON là một ý tưởng thực sự nguy hiểm. Bạn có chắc chắn 100% không có khả năng ai đó có thể tiêm mã riêng của họ vào chuỗi của bạn? - Charles
Đáng nói đến là không có thứ gì như một Đối tượng JSON. - Jezen Thomas


Nếu bạn đang nhận được điều này từ một trang web bên ngoài nó có thể hữu ích để sử dụng getJSON của jQuery. Nếu đó là danh sách bạn có thể lặp qua nó với $ .each

$.getJSON(url, function (json) {
    alert(json.result);
    $.each(json.list, function (i, fb) {
        alert(fb.result);
    });
});

49
2017-07-18 21:57





Nếu bạn muốn sử dụng JSON 3 đối với các trình duyệt cũ hơn, bạn có thể tải nó theo điều kiện với:

<script>
    window.JSON || 
    document.write('<script src="//cdnjs.cloudflare.com/ajax/libs/json3/3.2.4/json3.min.js"><\/scr'+'ipt>');
</script>

Bây giờ là tiêu chuẩn window.JSON đối tượng có sẵn cho bạn bất kể trình duyệt mà khách hàng đang chạy là gì.


32
2018-04-19 18:52



Nó có sẵn cho bạn sau json3.min.js đã tải xong. Điều này không cung cấp cho bạn một cuộc gọi lại khi nó có sẵn. Vì vậy, mã của bạn có thể làm việc ngày hôm nay, nhưng sẽ không hoạt động vào thứ tư khi cdnjs.cloudflare.com đột nhiên chậm hơn bình thường hoặc mạng được tải hoặc một trong 10000 lý do khác. RequireJS thay thế. - Peter V. Mørch
Peter, điều đó không đúng. Cả việc tải các tập lệnh bên ngoài và document.write đều là các hoạt động đồng bộ, vì vậy tất cả các tập lệnh được đặt sau sẽ đợi cho đến khi được tải trước khi thực thi. Để tải chỉ JSON3, đây là một cách tiếp cận tốt. RequireJS sẽ có ích nếu dự án của bạn phát triển phức tạp và phải tải các kịch bản với các mối quan hệ phụ thuộc phức tạp. Chỉ cần nhớ rằng document.write sẽ chặn hiển thị trang, vì vậy hãy đặt nó ở cuối đánh dấu của bạn. - huwiler
Lấy làm tiếc; Tôi nghĩ bạn đúng. Vui lòng bỏ qua nhận xét của tôi là không có thật. - Peter V. Mørch
Peter, bình luận đầu tiên của bạn là thông tin và hữu ích (tốt để có cảnh báo đó), chỉ cần không áp dụng trong 100% các trường hợp. Để có CDN ổn định hơn và nhanh hơn, bạn có thể sử dụng jsDelivr: //cdn.jsdelivr.net/json3/latest/json3.min.js - tomByrer


Ví dụ sau sẽ làm rõ:

var jsontext   = '{"name":"x","age":"11"}';
var getContact = JSON.parse(jsontext);
document.write(getContact.name + ", " + getContact.age);

// Output: x, 11

HOẶC LÀ

Bạn cũng có thể sử dụng eval chức năng. Ví dụ sau là sử dụng eval chức năng:

var jsontext   = '{"name":"x","age":"11"}';
var getContact = eval('(' + jsontext + ')');
document.write(getContact.name + ", " + getContact.age);

// Output: x, 11

Kể từ khi JSON.parse chức năng an toàn hơn và thực thi nhanh hơn hàm eval, tôi khuyên bạn nên sử dụng JSON.parse chức năng.


31
2017-10-01 07:42





Nếu bạn chuyển một biến chuỗi (một chuỗi JSON được định dạng tốt) thành JSON.parse từ MVC @Viewbag có doublequote, '' ', như dấu ngoặc kép, bạn cần xử lý nó trước JSON.parse (jsonstring)

    var jsonstring = '@ViewBag.jsonstring';
    jsonstring = jsonstring.replace(/&quot;/g, '"');  

25
2017-10-22 15:06



Bạn có ý gì với điều đó? Tại sao bạn đăng câu trả lời cho một câu hỏi cổ? - kay
Những gì họ nói trong các câu trả lời trước đó không giúp trường hợp nếu giá trị tham số có dấu ngoặc kép trong chuỗi. Nó cần phải được thay thế trên toàn cầu với một dấu ngoặc kép thực sự !! Tôi tìm ra một cách khó khăn chỉ để chia sẻ trong trường hợp ai đó có cùng một vấn đề - Jenna Leaf
Kay: Tôi đã làm rõ bài đăng của mình ngay bây giờ, đây là lần đầu tiên tôi cố gắng giúp đỡ. Vui lòng xem lại bài đăng. Bạn biết rằng đầu ra điều báo giá từ trang máy chủ là một vấn đề thực sự đối với JSON.parse (). - Jenna Leaf


Bạn có thể sử dụng hàm eval như trong một số câu trả lời khác. (Đừng quên thêm dấu ngoặc ôm.) Bạn sẽ biết tại sao khi bạn đào sâu hơn), hoặc đơn giản là sử dụng hàm jQuery parseJSON:

var response = '{"result":true , "count":1}'; 
var parsedJSON = $.parseJSON(response);

HOẶC LÀ

Bạn có thể sử dụng mã dưới đây.

var response = '{"result":true , "count":1}';
var jsonObject = JSON.parse(response);

Và bạn có thể truy cập các trường bằng jsonObject.result và jsonObject.count.


24
2018-06-06 03:51



jsonObject.count trong console.log trả về undefined. Tôi nên gọi nó như thế nào? - Sahar Ch.


Cách dễ nhất khi sử dụng parse() phương pháp:

var response = '{"a":true,"b":1}';
var JsonObject= JSON.parse(response);

đây là một ví dụ về cách lấy các giá trị:

var myResponseResult = JsonObject.a;
var myResponseCount = JsonObject.b;

23
2018-06-04 14:44





Không sử dụng thư viện, bạn có thể sử dụng eval - Lần duy nhất bạn nên sử dụng. Đó là an toàn hơn để sử dụng một thư viện mặc dù.

ví dụ...

var response = '{"result":true , "count":1}';

var parsedJSON = eval('('+response+')');

var result=parsedJSON.result;
var count=parsedJSON.count;

alert('result:'+result+' count:'+count);

19
2018-02-08 16:45



eval cant xử lý một chuỗi json trả về dưới dạng HTML - user192344
Nếu nó được mã hóa html, nó không phải là JSON nữa. - ThiefMaster♦
eval mong đợi javascript hợp lệ, mà JSON có thể không, vì vậy eval không thể phân tích cú pháp một số văn bản JSON hợp lệ (ví dụ: U + 2028 hợp lệ trong JSON, không hợp lệ trong javascript). - Marc Lehmann


JSON.parse () chuyển đổi bất kỳ chuỗi JSON nào được truyền vào hàm, thành một đối tượng JSON.

Để hiểu rõ hơn, nhấn F12 để mở phần tử Inspect Element của trình duyệt của bạn và đi tới bảng điều khiển để viết các lệnh sau:

var response = '{"result":true,"count":1}'; // Sample JSON object (string form)
JSON.parse(response); // Converts passed string to a JSON object.

Bây giờ chạy lệnh:

console.log(JSON.parse(response));

Bạn sẽ nhận được kết quả đầu ra là Object {result: true, count: 1}.

Để sử dụng đối tượng đó, bạn có thể gán nó cho biến, giả sử obj:

var obj = JSON.parse(response);

Bây giờ bằng cách sử dụng obj và toán tử dấu chấm (.), bạn có thể truy cập các thuộc tính của đối tượng JSON.

Cố gắng chạy lệnh

console.log(obj.result);

19
2018-02-18 10:08





Nếu bạn thích

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

bạn có thể truy cập các phần tử JSON bằng JsonObject với (.) chấm:

JsonObject.result;
JsonObject.count;

17
2018-05-15 05:42