2013-05-25 33 views
5

Đến kết quả lạ này hôm nay cố gắng hiển thị danh sách các đối tượng như JSON trong Grails 2.0.4 ... (tôi biết mình sẽ hối hận hỏi này trên tài khoản của một cái gì đó ngay dưới mũi của tôi ... cập nhật 5/26, dự đoán của tôi là chính xác, xem bên dưới :-))Hiển thị 'dưới dạng JSON' trong Grails với toán tử điều kiện không hiển thị chính xác

Điều này làm việc tốt; JSON hiển thị chính xác trong trình duyệt ...

def products = [] //ArrayList of Product objects from service  
def model = (products) ? [products:products] : [products:"No products found"] 
render model as JSON 

..so tại sao phiên bản rút ngắn này không có model hoạt động?

def products = []  
render ((products) ? [products:products] : [products:"No products found"]) as JSON 

Kết quả là JSON từ mã trên là đầu ra như một dòng văn bản, vì vậy tôi nghi ngờ nó không nhặt as JSON, nhưng nó ngoặc một cách chính xác, vì vậy thương vụ này là những gì?

[ 'sản phẩm': [com.test.domain.Product: null, com.test.domain.Product ...]

Trả lời

8

Đây là hành vi bình thường của render. Khi bạn cung cấp đối số cho render mà không cần niềng răng như

render model as JSON

Nó làm cho một lập content-type-text/json điều chỉnh ngầm. Nhưng trong trường hợp sau, bạn đã vô tình làm cho render sử dụng niềng răng như [dấu vào cú đúp đầu tiên sau khi render làm cho làm cho việc sử dụng bình thường render()]

render ((products) ? [products:products] : [products:"No products found"]) as JSON.

Trong trường hợp trên, bạn phải vượt qua trong các thông số được ghi tên vào render nhắc đến contentType, text hoặc model, status vv Vì vậy, để làm cho logic điều khiển nội tuyến như JSON trong trình duyệt/xem bạn phải làm như bên dưới:

render(contentType: "application/json", text: [products: (products ?: "No products found")] as JSON) 

Bạn cũng có thể sử dụng content-type làm text/json. Tôi thích application/json.

CẬP NHẬT
Alternative cách đơn giản nhất:
render([products: (products ?: "No products found")] as JSON)

+0

Thiệt hại, tôi gọi 'render()' mà thậm chí không nhận ra nó, thx, tôi kết thúc bằng cách sử dụng các yếu tố này trong giải pháp của bạn, đó là ngắn hơn một chút và tránh chỉ định kiểu nội dung hai lần: 'render (contentType:" text/json ") {[sản phẩm: (sản phẩm?:" Không tìm thấy sản phẩm ")]}' – raffian

+4

Điều này cũng hoạt động: 'render ((sản phẩm) ? [sản phẩm: sản phẩm]: [sản phẩm: "Không tìm thấy sản phẩm"]) dưới dạng JSON) ' –

+0

@JamesKleeh Ace trong lỗ, đẹp! .. và chính xác những gì tôi đang tìm kiếm! – raffian

1

Không biết lý do. Hãy thử sử dụng như sau:

render(contentType: 'text/json') {[ 
    'products': products ? : "No products found" 
]} 
1

Những gì bạn đang kêu gọi render với các thông số trong(), và sau đó áp dụng "như JSON" để kết quả!

Đừng quên rằng việc bỏ dấu ngoặc đơn chỉ là một phím tắt cho cuộc gọi phương thức, nhưng vẫn áp dụng các quy tắc tương tự.

3

Bản chất của vấn đề của bạn ở đây là trình biên dịch groovy dịch

render x as JSON 

nghĩa

render (x as JSON) 

nhưng nó diễn giải

render (x) as JSON 

nghĩa

(render x) as JSON 

Nếu tên phương thức (trong trường hợp này là render) được theo sau bởi dấu ngoặc đơn mở, thì chỉ mã lên đến dấu ngoặc đơn phù hợp được coi là danh sách đối số. Đây là lý do tại sao bạn cần thêm một bộ dấu ngoặc đơn để nói

render ((x) as JSON) 
Các vấn đề liên quan