2011-10-09 56 views
4

我正在寫一個Play應用程序,它將有數十個控制器操作返回JSON。每個JSON結果的格式稍有不同,由幾個基元組成。在Play中,渲染JSON時可以使用匿名類型和/或對象初始值設定項嗎?

我想避免創建一個Java類,以保持每個動作方法的返回類型,所以目前我使用一個HashMap,像這樣:

// used to populate the filters for an iphone app 
public static void filters() 
{ 
    // get four lists from the database 
    List<Chef> chefs= Chef.find("order by name asc").fetch(); 
    List<Cuisine> cuisines = Cuisine.find("order by name asc").fetch(); 
    List<Meal> meals = Meal.find("order by name asc").fetch(); 
    List<Ingredient> ingredients = Ingredient.find("order by name asc").fetch(); 
    // return them as JSON map 
    Map<String,Object> json = new HashMap<String,Object>(); 
    json.put("chefs", chefs); 
    json.put("cuisines", cuisines); 
    json.put("meals", meals); 
    json.put("ingredients", ingredients); 
    renderJSON(json); 
} 

這將返回JSON看起來像這樣,這就是我想:

{ 
    "chefs": [{},{},...{}], 
    "cuisines": [{},{},...{}], 
    "meals": [{},{},...{}], 
    "ingredients": [{},{},...{}] 
} 

我覺得的語法來構建的HashMap是多餘的。我沒有一噸的Java的經驗,所以我比較C#這讓我使用匿名類型對象初始化,以減少的代碼如下所示:

return Json(new 
{ 
    chefs = chefs, 
    cuisines = cuisines, 
    meals = meals, 
    ingredients = ingredients 
}); 

Java/Play世界裏有什麼讓我更加緊湊地寫這種代碼的嗎?

回答

1

沒有完全等效於Java中的C#構造,但是你可以創建一個匿名對象並使用成語圖所示初始化:

public static void filters() 
{ 
    renderJSON(new HashMap<String,Object>(){{ 

    // get four lists from the database 
    List<Chef> chefs= Chef.find("order by name asc").fetch(); 
    List<Cuisine> cuisines = Cuisine.find("order by name asc").fetch(); 
    List<Meal> meals = Meal.find("order by name asc").fetch(); 
    List<Ingredient> ingredients = Ingredient.find("order by name asc").fetch(); 

    // return them as JSON map 
    put("chefs", chefs); 
    put("cuisines", cuisines); 
    put("meals", meals); 
    put("ingredients", ingredients); 

    }}); 
} 

(你可以把4頁名單的聲明外匿名類型初始化,但那麼你就需要聲明他們最終)

+0

不幸的是,那只是返回一個空字符串。 \t \t renderJSON(new HashMap (){{put(「foo」,「string」); put(「bar」,123); }}); – Portman

+0

有趣。看起來renderJSON中的反射魔術不處理地圖的子類。從匿名圖創建實際的HashMap確實有效:\t Map map = new HashMap (){{put(「foo」,「string」);放(「酒吧」,123); }}; renderJSON(new HashMap (map)); –

+0

我做了一些另外的測試,並且renderJSON處理了HashMap的普通子類。所以只有匿名的子類會導致問題。 –

0

的Java確實有匿名類型,你應該能夠使用就好了。

// these would be accessed from DB or such; must be final so anonymous inner class can access 
final String _name = "Bob"; 
final int _iq = 125; 
renderJSON(new Object() { 
    public String name = nameValue; // or define 'getName()' 
    public int iq = iqValue; // ditto here 
}); 

這會創建匿名內部類,然後JSON數據聯編程序應該能夠反省它,序列化內容等等。

+0

Play框架沒有' t似乎喜歡這些變量是「最終」的事實。我得到以下異常:「Class play.classloading.enhancers.PropertiesEnhancer $ FieldAccessor無法訪問類controllers.TestController $ 1修飾符的成員」public「」 – Portman

+0

Play有趣的限制,那麼 - 不應該有任何根本性的問題因爲像傑克遜這樣的JSON框架會允許這種用法。 – StaxMan

相關問題