2010-02-13 48 views
58

Tôi đang sử dụng đối tượng JS để tạo biểu đồ với hình ảnh hóa của Google. Tôi đang cố gắng thiết kế nguồn dữ liệu. Lúc đầu, tôi đã tạo ra một phía máy khách đối tượng JS.Chuỗi JSON tới đối tượng JS

var JSONObject = { 
    cols: [{id: 'date', label: 'Date', type: 'date'}, 
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'}, 
     {id: 'soldpens', label: 'Sold Pens', type: 'number'}], 
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]}, 
     {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]}, 
    {c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}] 
}; 

var data = new google.visualization.DataTable(JSONObject, 0.5); 

Bây giờ tôi cần tìm nạp dữ liệu động. Vì vậy, tôi gửi một yêu cầu AJAX đến một trang trả về chuỗi JSON:

"cols: [{id: 'date', label: 'Date', type: 'date'}, 
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'}, 
{id: 'soldpens', label: 'Sold Pens', type: 'number'}], 
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]}, 
     {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]}, 
{c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}" 

này tôi lưu vào một biến:

var var1 = "cols: [{i ....... 66}]}" 

và hiển thị như

alert(var1); 

Bây giờ nhiệm vụ của tôi là để tạo một đối tượng JS từ chuỗi này. Đây không phải là làm việc. Khi tôi sử dụng một đối tượng JS, mọi thứ hoạt động tốt và tôi có thể nhận được đồ thị yêu cầu của mình. Bây giờ nếu tôi cố gắng đặt cùng một giá trị của chuỗi từ yêu cầu AJAX mà tôi đã xác nhận từ một thông điệp cảnh báo vào một đối tượng n, đối tượng không được tạo ra một cách chính xác. Xin vui lòng cho tôi biết ý kiến ​​của bạn và bất kỳ sự điều chỉnh hay lời khuyên nào.

+1

Sử dụng phương thức 'eval (json_string)' của javascript để lấy chuỗi đối tượng json. Tuy nhiên, hãy cảnh báo, chức năng tương tự có thể nguy hiểm vì nó có thể thực thi các tập lệnh. –

+1

chỉ là một FYI - Tên và chuỗi khóa ** PHẢI ** nằm bên trong '" 'trong JSON hợp lệ: http://simonwillison.net/2006/Oct/11/json/ – gnarf

+0

có thể trùng lặp của [Nối tiếp thành JSON trong jQuery] (http://stackoverflow.com/questions/191881/serializing-to-json-in-jquery) – outis

Trả lời

118

Một số trình duyệt hiện đại có hỗ trợ cho phân tích cú pháp JSON thành đối tượng bẩm sinh:

var var1 = '{"cols": [{"i" ....... 66}]}'; 
var result = JSON.parse(var1); 

Đối với các trình duyệt không hỗ trợ nó, bạn có thể tải json2.js từ json.org cho phân tích an toàn của một Đối tượng JSON. Kịch bản lệnh sẽ kiểm tra hỗ trợ JSON nguyên gốc và nếu nó không tồn tại, hãy cung cấp đối tượng toàn cầu JSON thay thế. Nếu đối tượng gốc nhanh hơn có sẵn, nó sẽ chỉ thoát khỏi tập lệnh để nguyên vẹn nó. Tuy nhiên, bạn phải cung cấp JSON hợp lệ hoặc nó sẽ ném một lỗi — bạn có thể kiểm tra tính hợp lệ của JSON của mình với http://jslint.com hoặc http://jsonlint.com.

+4

Có liên quan: http://caniuse.com/json – JamesHalsall

5

Bạn có thể sử dụng eval (jsonString) nếu bạn tin tưởng dữ liệu trong chuỗi, nếu không bạn sẽ cần phải phân tích cú pháp chính xác - hãy kiểm tra json.org đối với một số mẫu mã.

+1

Tôi có thể tin tưởng nội dung từ API của một trang web lớn (Reddit)? –

3

Bạn có thể sử dụng this library từ JSON.org để dịch chuỗi của bạn thành đối tượng JSON.

var var1_obj = JSON.parse(var1); 

Hoặc bạn cũng có thể sử dụng thư viện jquery-json.

var var1_obj = $.toJSON(var1); 
5

chuỗi trong câu hỏi của bạn không phải là chuỗi json hợp lệ. Từ json.org website:

JSON được xây dựng trên hai cấu trúc:

* A collection of name/value pairs. In various languages, this is 
    realized as an object, record, struct, dictionary, hash table, keyed list, or 
    associative array. 
* An ordered list of values. In most languages, this is realized as an 
    array, vector, list, or sequence. 

Về cơ bản một chuỗi json sẽ luôn bắt đầu với một trong hai {hoặc [.

Sau đó, vì @Andy E và @Cryo cho biết bạn có thể phân tích chuỗi bằng json2.js hoặc một số thư viện khác.

IMHO bạn nên tránh eval vì nó sẽ có bất kỳ chương trình javascript nào, vì vậy bạn có thể gặp phải vấn đề bảo mật.

3

Chuỗi bạn đang trả về không phải là JSON hợp lệ. Các tên trong các đối tượng cần phải được trích dẫn và toàn bộ chuỗi cần phải được đặt trong { … } để tạo thành một đối tượng.JSON cũng không thể chứa một cái gì đó như new Date(). JSON chỉ là một tập hợp con nhỏ của JavaScript chỉ có chuỗi, số, đối tượng, mảng, true, falsenull.

Xem JSON grammar để biết thêm thông tin.

Các vấn đề liên quan