2012-01-27 64 views
3

我的問題是:我不想在json響應中返回整個模型對象結構和數據。 renderJSON()返回響應中模型的所有內容。playframework .json模板List-Ojects與foreach?

所以我認爲最好的方法是使用* .json模板。好吧,現在我有一個List,我現在不知道* .json-template中的語法必須如何。

控制器的一部分:

List<User> users = User.find("byActive", true).fetch(); 
if (users != null) { 
    render(users); 
} 

「用戶/ showAll.json」(模板):

//something like foreach(User currentUser in users) 
{ 
    "username": "${currentUser.name}", 
    "userdescr": "${currentUser.description}" 
} 

對於單個用戶是沒有問題的,我得到了它,但它是如何看像json模板內的用戶列表?

回答

4

還有另一種解決問題的方法,而無需使用以.json模板。 「renderJSON()」有一個變體需要JsonSerializer作爲參數,所以你可以定義你自己的序列化器來實現JsonSerializer,並決定在響應中發送模型對象的哪一部分。然後你可以調用renderJSON()來返回控制器中的JSON對象。

例子:

public class UserSerializer implements JsonSerializer<User> { 

    public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) { 
     Gson gson = new GsonBuilder() 
      .setExclusionStrategies(new LocalExclusionStrategy()).create(); 
     return gson.toJsonTree(src); 
    } 

    public static class LocalExclusionStrategy implements ExclusionStrategy { 
     public boolean shouldSkipClass(Class<?> clazz) { 
      return false; 
     } 

     public boolean shouldSkipField(FieldAttributes f) { 
      // add exlusion rules here: 
      // exclude all fields whose name is not "name" or "description" 
      return !f.getName().toLowerCase().equals("name") 
       && !f.getName().toLowerCase().equals("description"); 
     } 
    } 
} 

在你的控制器:

List<User> users = User.find("byActive", true).fetch(); 
renderJSON(users, new UserSerializer()); 

播放架構利用谷歌的GSON庫JSON序列化/反序列化 你可以找到GSON here的更多信息

+1

隨着串行您還可以避免發生錯誤「發生IllegalStateException:發現循環引用」,如果您有後備引用,則會發生此錯誤 – Gambo 2012-01-30 10:06:51