我正在寫一個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世界裏有什麼讓我更加緊湊地寫這種代碼的嗎?
不幸的是,那只是返回一個空字符串。 \t \t renderJSON(new HashMap(){{put(「foo」,「string」); put(「bar」,123); }}); –
Portman
有趣。看起來renderJSON中的反射魔術不處理地圖的子類。從匿名圖創建實際的HashMap確實有效:\t Map map = new HashMap (){{put(「foo」,「string」);放(「酒吧」,123); }}; renderJSON(new HashMap (map)); –
我做了一些另外的測試,並且renderJSON處理了HashMap的普通子類。所以只有匿名的子類會導致問題。 –