2009-11-28 15 views
5

Tôi đang sử dụng chức năng ajax của jQuery để truy cập url tên miền chéo. Url sẽ trả về json. Tôi đang trong giai đoạn phát hiện với điều này nhưng tôi nghĩ, bởi vì các giá trị json chứa một số '& quot' dây, json eval là ném một lỗi và dừng việc thực hiện kịch bản phía khách hàng của tôi. Lỗi mà tôi nhận được là "chuỗi chưa hoàn thành". Tôi biết rằng nếu tôi mã hóa mã json được trả lại bằng cách đặt nó vào div địa phương và xóa '& quot;' chuỗi (và một vài ký tự đặc biệt ẩn), tôi có thể nhận được các json để đánh giá thành công. Cho dù thông qua công việc xung quanh, hoặc thông qua một chỉnh sửa mã của tôi, tôi có thể làm gì để lấy json từ url và lưu trữ nó trong javascript phía khách hàng của tôi như là một đối tượng json hợp lệ?với jQuery, truy cập json từ url miền chéo nơi json có thể được tạo thành kém

mã hiện tại của tôi. không có hàm nào được xác định (thành công, đầy đủ, lỗi, dữ liệuFilter) thực thi:

$(function() { 
    $.ajax({ 
    url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
    dataType: "jsonp", 
    success: successFunc, 
    complete: completeFunc, 
    error: errorFunc, 
    dataFilter: dataFilterFunc 
}); 

}); 

function successFunc() { console.log('successFunc(). enter.'); } 
function completeFunc() { console.log('complete(). enter.'); } 
function errorFunc() { console.log('errorFunc(). enter.'); } 
function dataFilterFunc(data, type) { 
    data.replace(/\W/g, ' '); 
    return data; 
} 

Trả lời

1

Hmm. Tôi không biết jQuery, nhưng tôi biết JSON. (Tôi đã viết một trình phân tích cú pháp dựa trên C++ cho nó.) Tôi đã đi đến url bạn hiển thị: http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?. Trình phân tích cú pháp JSON của Python chấp nhận điều đó và kinh nghiệm của tôi là trình phân tích cú pháp JSON của Python là chính xác. Lưu ý rằng điều này:

{ "blah": "string " More more more" } 

... là hợp lệ JSON. Phần " không có giải thích đặc biệt trong JSON - chúng chỉ là các ký tự trong chuỗi.


Edit: Looking harder at này, Tôi find nó very interesting rằng whatever là generating này là escaping some forward slashes, nhưng not all. Các mục "Bắt đầu" là "/ Ngày (-XXXXX) /", là văn bản /Date(-XXXXX)/ -/trong JSON có thể tùy chọn được thoát. Tuy nhiên, trong các mục có khóa "SpeakerURI" và "URI", chúng không bị thoát.


Chỉnh sửa: Chạy điều này thông qua trình phân tích cú pháp dựa trên C++ của tôi. Ban đầu nó không lấy nó, nhưng JSON này thực sự đã lộ ra một lỗi trong trình phân tích cú pháp của tôi.

+0

Đó là quy ước MS để tuần tự hóa các đối tượng .NET 'DateTime': http://msdn.microsoft.com/en-us/library/bb299886 (loband).aspx#intro_to_json_sidebarb –

0

Bạn có thể xem xét thử plugin jquery-jsponp, sửa một số vấn đề với xử lý jsonp của jQuery.

http://code.google.com/p/jquery-jsonp/

tôi sử dụng nó và có rất nhiều ví dụ tuyệt vời.

Bạn thực sự cần phải gọi lại để bạn có thể xem những gì đang diễn ra.


Cập nhật: Tôi đã đâm bằng jsonp và tôi nhận được lỗi mã thông báo không mong muốn. Không chắc chắn lý do tại sao - tôi có thể lấy dữ liệu theo cách thủ công từ URL, gán nó cho biến JavaScript trong bảng điều khiển và điều đó là tốt.

+0

Nó có nói ở đâu trong JSON không? Nếu bạn cần một cái gì đó với ngắt dòng, tôi đặt một ở đây: http://pastebin.com/m65681d28 - điều này trông giống như một lỗi trong trình phân tích cú pháp JSON. – Thanatos

+0

Xin lỗi. Không có thời gian để theo dõi tối nay. Có lẽ ngày mai. – Nosredna

+0

Tôi cũng phải sửa đổi dòng 250 trong pastbin.com/m65681d28 để json phân tích cú pháp. Nếu tôi nhớ chính xác, tôi phải thay thế 'dấu cách' sau "Cấp độ" và "Thời lượng:". Tôi sẽ xác minh vào ngày mai. – mark

3

Vấn đề là dịch vụ JSONP, nó loại bỏ hoàn toàn tham số callback.

Một JSONPphản ứng chỉ đơn giản là một cuộc gọi chức năng sử dụng tham số callback get như tên hàm:

Nếu bạn nhìn phản ứng của một số dịch vụ JSONP, nó phải là như thế này:

http://somesite.com/jsonp?callback=myCallback

Sẽ trả lại:

myCallback({/*json*/}); 

Trong khi một you post đang trở lại đồng bằngvalid JSON, nhưng nó không thể được xử lý như một phản ứng JSONP.

+1

Ooh, liên kết lint JSON có giá trị, cảm ơn bạn. – Thanatos

+1

Yup. Đó là nó. Nắm bắt tốt. – Nosredna

0

Sau khi phân tích dữ liệu của bạn trên một giờ,

tôi thấy sau

{ 
    "URI":"/rest/sessions/Maintainable-ASPNET-MVC", 
    "Title":"Maintainable ASP.NET MVC", 
    "Abstract":".....\u003e\u2028Duration: 60-90 minutes\u003cbr\u003e\u2028Subject Area: development....." 
} 

Có char \ u2028 trước Thời gian, và Môn,

\ u2028 là dòng seperator, vì vậy nó có nghĩa là, \ n, vì vậy bạn có ngắt dòng giữa dấu ngoặc kép "", đó có thể là trường hợp gốc.

Nếu bạn loại bỏ điều đó, Bạn sẽ không thấy chuỗi chưa hoàn thành chữ trong firebug.

Để kiểm tra rằng, dán sau vào thanh địa chỉ, Firefox và Opera thất bại, trong khi IE8 và Chrome đang làm việc

javascript:alert(eval('[{"Abstract":"\u003e
 Duration: 60-90 minutes\u003cbr\u003e
 Subject Area: development."}]')) 

ai đó viết blog về điều đó đã

http://bulknews.typepad.com/blog/2009/02/json-jquery-and-some-unicode-characters-u2028.html

+0

Không - đó là hợp lệ UTF-8: nó là U-2028, là một dấu tách dòng. Giải mã của bạn không thành công vì bạn đã nhập sai. Nó không ảnh hưởng đến tính hợp lệ của văn bản JSON. – Thanatos

+1

Và bạn đã tạo bản cập nhật nào? Sự hiện diện của một U + 2028 trong một chuỗi JSON là JSON hợp lệ. – Thanatos

+0

Bù đắp 0x62E1 bên trong văn bản JSON là nơi bạn đang tìm kiếm, chính xác? – Thanatos

0

tôi không dường như gần hơn với giải pháp phía khách hàng. Tôi đã thay đổi mã để sử dụng jQuery-jsonp. Nó bây giờ trông như thế này:

$(function() { 
    $.jsonp({ 
    url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
    async: false, 
    dataType: "jsonp", 
    success: successFunc, 
    complete: completeFunc, 
    error: errorFunc, 
    dataFilter: dataFilterFunc 
}); 

}); 

function successFunc(json, textStatus) { 
    console.log('successFunc(). enter.'); 
} 
function completeFunc(xOptions, textStatus) { 
    console.log('complete(). textStatus: ['+textStatus + ']'); 
} 
function errorFunc(xOptions, textStatus) { 
    console.log('errorFunc(). textStatus: [' + textStatus + ']'); 
} 
function dataFilterFunc(j) { 
    console.log('dataFilterFunc(). enter.'); 
    return j; 
} 

màn hình console log Firebug của:

X unterminated string literal 
[{"URI"..... (the json returned from the server 
errorFunc(). textStatus: [error] 
complete(). textStatus: [error] 

Đối với bất cứ lý do, các phân tích cú pháp JSON trong trình duyệt của tôi Firefox (FF v3.0.15, Linux Ubuntu 9.0.4) được ném trường hợp ngoại lệ "chuỗi chưa hoàn tất". Tôi biết nếu tôi xóa các chuỗi '& q u' t 'và hai ký tự trong khối' Maintainable ASP.NET MVC 'thì json sẽ phân tích cú pháp thành công. Vì tôi không có quyền kiểm soát ở phía máy chủ, có điều gì tôi có thể làm với javascript phía máy khách mà cuối cùng sẽ nhận được chuỗi json của máy chủ, như-là, vào một đối tượng json phía máy khách. Tôi nghĩ rằng thuộc tính dataFilter cho jsonp được thiết lập chính xác cho mục đích đó, để ngăn chặn các json và 'chà' nó. Tuy nhiên, hàm đó trong mã của tôi không được gọi, có thể vì json được truyền vào hàm dataFilterFunc sẽ không phân tích cú pháp thành công.

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