2012-04-03 52 views
6

EDIT:entry.content.$t là trường sai để truy cập các ô riêng lẻ. mục nhập.gsx $ [tiêu đề cột ô] là phương pháp chính xác. Xin lỗi và cảm ơn vì đã giúp giải quyết vấn đề này.Phân tích cú pháp JSON từ Bảng tính Google

Câu hỏi gốc:

Tôi đang cố gắng phân tích cú pháp JSON data from a Google Spreadsheet. Vấn đề là, trường mục nhập trả về một chuỗi là toàn bộ hàng của bảng tính — nhưng xuất hiện dưới dạng đối tượng không đúng định dạng. Những người khác phân tích cú pháp dữ liệu này như thế nào? Dưới đây là những gì các nút nội dung trông giống như:

"content": 
{ 
    "type" :"text", 
    "$t"  :"location: 780 Valencia St San Francisco, CA 94110, 
       phonenumber: (555) 555-5555, 
       website: http://www.780cafe.com, 
       latitude: 37.760505, 
       longitude: -122.421447" 
}, 

Nhìn cẩn thận, lĩnh vực $t trả toàn bộ một chuỗi đó là một hàng trong bảng tính của Google. Vì vậy, entry.content.$t trả về một chuỗi: location: 780 Valencia St San Francisco, CA 94110, phonenumber: (555) 555-5555...

Tiếp tục làm trầm trọng thêm vấn đề này là một số ô trong bảng tính có dấu phẩy (như địa chỉ) không bị thoát hoặc trích dẫn. Một cái gì đó như

jQuery.parseJSON(entry.content.$t) 

hoặc

eval('('+ entry.content.$t + ')') 

ném một lỗi. Tôi cho rằng regex là một lựa chọn, nhưng tôi hy vọng những người khác có thể đã giải quyết điều này một cách thanh lịch hơn. Cảm ơn đã giúp đỡ!

+1

gì được yêu cầu bạn sử dụng để lấy dữ liệu JSON? Bạn có sử dụng loại ô hoặc danh sách loại không? (xem http://code.google.com/apis/gdata/samples/spreadsheet_sample.html) – HBP

+1

Nhìn vào các ví dụ hơn nữa, tôi nghĩ bạn đang làm điều gì đó sai - trong cách bạn yêu cầu JSON hoặc trong chính dữ liệu bảng tính. Từ những gì tôi có thể thấy, bạn không nên nhận toàn bộ hàng dưới dạng trường văn bản; bạn sẽ nhận được một sự kết hợp của các đối tượng và mảng trong dữ liệu của bạn để biểu thị các hàng và cột. –

+0

Doh! Tôi đã hiểu rồi. Bạn hiểu rồi. Tôi đã giải nén nút sai. Rõ ràng, nó trả về các đối tượng riêng lẻ cho mỗi ô. Lỗi của tôi. THanks rất nhiều cho việc đánh bắt này. – jrue

Trả lời

1

"Văn bản" bên trong thuộc tính $t không phải là JSON. Theo tài liệu, các nút văn bản được chuyển thành các thuộc tính $t, vì vậy bạn không thể dựa vào bất kỳ thứ gì trong đó có định dạng JSON đúng.

Tôi khuyên bạn nên sử dụng cụm từ thông dụng thay vào đó, mặc dù tôi sẽ cảnh báo bạn rằng để phân tích cú pháp đầu ra đó sẽ yêu cầu một số nội dung lạ mắt. Bạn sẽ kết thúc bằng cách sử dụng xác nhận vì bạn không thể phân tách bằng dấu phẩy - bạn sẽ phải tìm kiếm (\w+): nhưng để tìm phần tử tiếp theo, bạn sẽ phải nhận tất cả mọi thứ cho đến một kết hợp khác (\w+):, mà còn không gobble nó lên. Nó có thể được thực hiện.

1

Mới đây, tôi đã gặp phải vấn đề tương tự.

Để phân tích nội dung của $ t, bạn có thể sử dụng RegEx này:

/(\w+): (.+?(?=(?:, \w+:|$)))/mgi 

nó sẽ trở lại cặp khóa-giá trị.

JavaScript ví dụ:

var currentPropertiesText = jsonEntry['content']['$t']; 

    // var propsArray = currentPropertiesText.split(", "); 
    var re = /(\w+): (.+?(?=(?:, \w+:|$)))/mgi; 
    var propsArray = re.exec(currentPropertiesText) 
    var props = {}; 

    while (propsArray != null) { 

     var propName = propsArray[1]; 
     var propValue = propsArray[2]; 

     props[propName] = propValue; 

     propsArray = re.exec(currentPropertiesText); 
    } 

Điều đó sẽ giúp :-)

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