我有弹簧休息服务器。
有很多请求,其中一个参数是fields
字段是服务器应该返回的字段集。像:/?fields=[id,name]
和服务器应该返回两个字段的JSON对象
我想知道产生这种反应的最佳做法是什么。
我们这样做:
private Map<String, Object> processBook(BookEntity book, Set<String> fields, String locale){
Map<String, Object> map = new HashMap<String, Object>();
//..
if(fields.contains(ID)){
map.put(ID, book.getId());
}
if(fields.contains(ISBN)){
map.put(ISBN, book.getIsbn());
}
if(fields.contains(DESCRIPTION)){
if(locale.equals(UserLocale.UK)) map.put(DESCRIPTION, book.getDescriptionUa());
else if(locale.equals(UserLocale.RU)) map.put(DESCRIPTION, book.getDescriptionRu());
else map.put(DESCRIPTION, book.getDescriptionEn());
}
//..
return map;
}
也许有更好的选择?
答案 0 :(得分:1)
请注意,在您的情况下,您从DB获取所有数据 - 完全填充 BookEntity 对象,然后仅显示请求的字段。
在我看来,将字段列表委托给适当的下游集成调用并且仅使用必要字段获取 BookEntity 对象是“更好的选择”。然后上面提到的方法将减少到只有一行,您的数据库响应将更加轻量级,因此它将为您的系统带来简单性和优化收益。
任何足够的DB都提供这样的功能:SQL或NoSQL等。
P.S。加上对象到JSON映射的标准方法,例如顶级的Jackson或GSON。
答案 1 :(得分:0)
您可以拥有并使用所需属性进行对象,而不是添加到地图中,而不是添加地图。
然后您可以使用Google的Gson转换您的地图将对象转换为Json对象。
看一下this快速教程。
答案 2 :(得分:0)
一种方法是使用asMap函数。
Map<String, Object> map = book.asMap();
map.keySet().retainAll(fields);