Java Reflect与JSONArray的一个应用场景
2018-06-08 本文已影响0人
writeanewworld
1.应用
image.png
2.数据库结构
image.png
3.我想要的json格式
image.png
4.场景:
经理提出要求,给他把图一的页面渲染好,嗯~
我的做法:直接在JsonTemplateParams实体类中声明一个ItemSku实体类,通过value(两张表的关联字段)调用查询接口,然后setItemSku就拼装完成了。
可是经理看了之后不允许使用这种方法。。。(模板实体类比较特殊)
5.Map + 反射
那好吧,这样的话使用一个Map来拼装,反正用model.addAttribute("",);传到页面 前端thymleaf模板会识别的。
map格式:List<Map<String, Object>> array = new ArrayList<String,Object>();
已经拿到了JsonTemplatesPutsParams集合:
List<JsonTemplatesPutsParams> jsonTemplatesPutsParams =
getParams(pageId,claName+".itemNo");
写法如下:
List<Map<String, Object>> array = new ArrayList<>();
Class<JsonTemplatesPutsParams> clazz = JsonTemplatesPutsParams.class;
for (JsonTemplatesPutsParams jsonTemplate: jsonTemplatesPutsParams) {
Map<String, Object> map = new HashMap<>();
for (Field f: clazz.getDeclaredFields()) {
f.setAccessible(true);
try {
map.put(f.getName(), f.get(jsonTemplate));
} catch (Exception e) {
e.printStackTrace();
}
}
ItemSku itemSku = itemResponsitoryAdmin.selectItemSkuList(jsonTemplate.getValue()).get(0);
itemSku.setImage(COSUtil.getSignatureUrl(itemSku.getImage()));
map.put("itemSku", itemSku);
array.add(map);
}
有点臃肿,总之不是很满意,查询了一下JSON的api,感觉JSONArray写一下会简单很多。
6.JSONArray
JSONArray array = (JSONArray)JSON.toJSON(jsonTemplatesPutsParams);
for (int i=0, len=array.size(); i<len; ++i) {
JSONObject obj = (JSONObject) array.get(i);
JsonTemplatesPutsParams jsonTemplate = jsonTemplatesPutsParams.get(i);
ItemSku itemSku = itemResponsitoryAdmin.selectItemSkuList(jsonTemplate.getValue()).get(0);
itemSku.setImage(COSUtil.getSignatureUrl(itemSku.getImage()));
obj.put("itemSku", JSON.toJSON(itemSku));
}
这样的话感觉精简了许多.
model.addAttribute("item",array);
7.html代码
<table class="table table-bordered">
<tbody>
<tr >
<th style="width: 10px">#</th>
<th style="text-align:center">商品规格号</th>
<th style="text-align:center">商品规格编号</th>
<th style="text-align:center">商品名称</th>
<th style="text-align:center">商品图片</th>
<th style="text-align:center">排序号</th>
<th style="width: 40px;text-align:center">操作</th>
</tr>
<tr style="text-align:center" th:each="item,row : ${items}">
<td th:text="${row.count}+'.'"></td>
<td th:text="${item.value}"></td>
<td th:text="${item.itemSku.sku}"></td>
<td th:text="${item.itemSku.name}"></td>
<td>
<img th:attr="src=${item.itemSku.image}" alt="商品规格图片" style="width:35px;height:35px;">
</td>
<td th:text="${item.sort}"></td>
<td>
<form th:action="'deleteItem/'+${item.id}">
<input type="hidden"/>
<button class="btn btn-primary">删除</button>
</form>
</td>
</tr>
</tbody>
</table>