2012-03-09 38 views
17

Tôi sử dụng mã sau đây để hiển thị dữ liệu ở định dạng JSON.Hiển thị JSON trong grails

render(contentType:"text/json") { 
    results = array { 
     db.eachRow(query) { row -> 
      def rs = row.toRowResult() 
      def a = b(rs.name,c,d) 
      aMap.put("A",a) 
      pair(aMap) 
     } 
    } 
    if (results) { 
     status = "OK" 
    } 
    else { 
     status ="Nothing present" 
    } 
} 

Đoạn mã trên tạo ra JSON theo định dạng sau

{ 
    "results": [ 
     {"A":"value1"}, 
     {"A":"value2"}, 
     ................... 
     {"A":"valuen"} 
    ], 
    "status":"OK" 
} 

Như u xem ở trên, dữ liệu được trả lại như một mảng của các đối tượng . Có cách nào tôi có thể hiển thị dữ liệu kết quả dưới dạng mảng của các phần tử không. Giống như

{ 
    "results": [ 
     "value1", 
     "value2", 
     ................... 
     "valuen" 
    ], 
    "status":"OK" 
} 

Trả lời

35

Cách đối tượng JSON đang được xây dựng khá tối nghĩa. Những gì tôi thích làm để trả lời JSON trong grails là tạo ra một bản đồ hoặc danh sách trong groovy và sau đó sử dụng phương thức render chỉ để chuyển đổi nó thành JSON.

Làm việc chuyển đổi rowResult 's bên trong làm cho phương pháp làm cho nó khá lộn xộn, tôi thà đi cho một cái gì đó như thế này

def results = db.rows(query).collect { rowResult -> 
    b(rowResult.name, c, d) 
} 
render(contentType: 'text/json') {[ 
    'results': results, 
    'status': results ? "OK" : "Nothing present" 
]} 

Tôi nghĩ rằng đó là dễ đọc hơn, và thậm chí ngắn hơn. Đoạn mã này sẽ cho bạn kết quả mong muốn: không có đối tượng bên trong mảng results, chỉ là chuỗi.

Lưu ý việc sử dụng rows, trả về danh sách RowResult, loại bỏ sự cần thiết phải lấy nó từ ResultSet's. Danh sách được sử dụng để thu thập giá trị được chuyển đổi a bằng cách gọi b trên tên của mỗi hàng. Thu thập các yếu tố không ngụ ý tạo bản đồ (như trong JSON { "A":"value1"} bạn đã nhận được), chỉ giống như @ sẽ-buck đạt được với toán tử << trên danh sách trống mới.

Tất cả những gì chúng tôi thực hiện với phương thức hiển thị là khai báo loại nội dung text/json và chuyển cho nó một bản đồ chữ có chứa các phím resultsstatus mà bạn muốn ghi vào phản hồi. Toán tử điều kiện được sử dụng để xác định chính xác trạng thái. Nó cũng có thể được sử dụng như thế này, bằng công cụ chuyển đổi JSON @ will-buck cũng được đề cập:

def responseData = [ 
    'results': results, 
    'status': results ? "OK" : "Nothing present" 
] 
render responseData as JSON 
+1

Tôi thích đoạn mã cuối cùng của bạn tốt hơn đoạn đầu tiên. Nó có thể là trình gỡ lỗi thân thiện hơn. – epidemian

+0

Đúng vậy, công cụ chuyển đổi JSON đó chắc chắn là cách để đi :) –

+1

Có vấn đề với đoạn trích cuối cùng của bạn trong Grails 2.0. Câu trả lời được hiển thị dưới dạng văn bản được đặt trong '{}'. – raffian

4

Chỉ ra bởi một chút :) Chỉ cần thay đổi

aMap.put("A", a) 

là một bộ sưu tập hoặc danh sách, chứ không phải là một bản đồ. vì vậy, chẳng hạn như

def aList = [] 
aList << a 

Sẽ giúp bạn có được những gì bạn muốn!

Là một phụ trang, có một trình chuyển đổi JSON trong grails sẽ thực hiện việc xây dựng chuỗi đó cho bạn. Nhìn vào nó here

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