2010-09-16 27 views
8

Tôi mới sử dụng Khung chơi và gặp sự cố khi hiển thị đối tượng JSON.Phát khuôn khổ hiển thịJSON Số phát hành

public static void LoginFail() { 

Object[][] statusArray = { 

    {"Status", "401"}, 
    {"Message", "Unauthorized"}, 
     {"Detail", "No API Key Supplied"} 

    }; 

renderJSON(statusArray); 

} 

Điều này chỉ hiển thị [[{},{}],[{},{}],[{},{}]] ... tôi đang làm gì sai? Tôi không thể tìm thấy bất kỳ tài liệu vững chắc về điều này. Tôi đã thử định cấu hình tuyến đường cho Application.LoginFail(format:'json'), nhưng điều này không có gì.

Trả lời

11

Từ giao diện mã của bạn, có vẻ như bạn đang tự mình tạo chuỗi JSON, sử dụng một mảng đối tượng kiểu. Đoán duy nhất của tôi là tại sao điều này không hiệu quả là GSON (thư viện JSON được sử dụng bằng cách chơi) không biết cách chuyển đổi nó thành cặp khóa-giá trị (mặc dù mảng của bạn là 2 chiều). Vậy làm thế nào về việc thay đổi statusArray để String và nội dung của nó để:

{ 
    "Status": "401", 
    "Message": "Unauthorized", 
    "Detail": "No API Key Supplied" 
} 

Đặt rằng vào renderJSON(statusArray) và bạn cần sử dụng tốt.

Là một thay thế bạn có thể tạo một .json mẫu đơn giản như sau:

{ 
    "Status": ${status}, 
    "Message": ${message}, 
    "Detail": ${detail} 
} 

và gọi nó là từ một phương pháp điều khiển thông qua render(status, message, detail). status, messagedetail cũng là Chuỗi tại đây. Ví dụ về phương pháp điều khiển:

public static void loginFail(final String status, final String message, final String detail) { 
    render(status, message, detail); 
} 

và mẫu của bạn sẽ được gọi là loginFail.json (tên của phương pháp điều khiển). Bằng cách đó bạn có thể gọi phương thức điều khiển trong bất kỳ logic nào bạn phải xác minh thông tin đăng nhập. Sau khi đăng nhập thất bại, bạn chỉ rõ lý do tại sao (thông qua trạng thái, tin nhắn và chi tiết) bằng cách gọi phương thức loginFail.

+3

Nó cũng đáng chú ý là renderJSON có thể mất một đối số chuỗi là tốt, mà bỏ qua phân tích GSON. Điều này rất hữu ích nếu bạn sử dụng một cái gì đó như Jackson để phân tích cú pháp JSON của bạn (như tôi làm). –

14

Do đó các & cách tái sử dụng đơn giản bằng cách tạo ra một đối tượng StatusMessage

public class StatusMessage { 
    public String status; 
    public String message; 
    public String detail; 

    public StatusMessage(String status, String message, String detail) [ 
     this.status = status; 
     this.message = message; 
     this.detail = detail; 
    } 
} 

Và sau đó

renderJSON(new StatusMessage("401", "Unauthorized", "No API Key Supplied")); 
+0

Lưu ý, lớp học này phải được công khai. Nó không hoạt động đối với tôi đối với lớp bên trong và lớp, được khai báo bên trong phương thức – Anton

0

tốt nhất trong trường hợp này được sử dụng một HashMap:

public static void LoginFail() { 
    Map<String, String> status = new HashMap<String, String>(); 

    status.put("Status", "401"); 
    status.put("Message", "Unauthorized"); 
    status.put("Detail", "No API Key Supplied"); 

    renderJSON(status); 
} 

Bạn cũng có thể sử dụng một chiến lược khác, để xác định một đối tượng với định nghĩa về những gì bạn muốn trở lại và đưa ra này:

public class Status{ 

    public String status, message, detail; 

    public Status(String status, String message, String detail){ 
     this.status = status; 
     this.message = message; 
     this.detail = detail; 
    } 
} 

public static void LoginFail(){ 
    Status status = new Status("401", "Unauthorized", "No API Key Supplied"); 

    renderJSON(status); 
} 
0

Đây là những gì bạn có thể làm

import play.libs.Json; 

Nếu bạn đang đọc JSON từ trình duyệt như HTTP Body sau đó

JsonNode json = request().body().asJson();  
Program program = Json.fromJson(json, Program.class); 

đây Chương trình có thể của bạn lớp thực thể hoặc đối tượng truyền dữ liệu.

Nếu bạn có để lấy hồ sơ và gửi nó đến trình duyệt trong JSON sau đó làm như sau

Program program = ProgramDAO.findById(id); 
     if(program!=null){ 
      result = ok(Json.toJson(program)); 
     } 

Hope this helps

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