获取商品参数 json 串,转成 java 对象,再拼接成前台 html 的Service方法
@Override
public String getItemParam(Long itemId) {
try {
String json = HttpClientUtil.doGet(REST_BASE_URL+ITEM_PARAM_URL+itemId);
if (StringUtils.isNotEmpty(json)) {
TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItemParamItem.class);
if (taotaoResult.getStatus()==200) {
TbItemParamItem itemParamItem = (TbItemParamItem) taotaoResult.getData();
String data = itemParamItem.getParamData();
String html = "";
//把规格参数字符串转换为json对象(这里是转换成了List集合,集合里面存的map键值对)
List<Map> jsonList = JsonUtils.jsonToList(data, Map.class);
for (Map map : jsonList) {
html+="<div class=\"Ptable-item\">\n" +
"<h3>"+map.get("group")+"</h3>\n" +
"<dl>\n";
//这里map里面的key params 对应的值还是可以强制转为另一个map(因为map里面的建和值都可以是对象)
//因为前面已经用 JsonUtils.jsonToList 整体转换过,所以这里只要强制转换即可
List<Map> paramList = (List<Map>) map.get("params");
for (Map param : paramList) {
html+= "<dt>"+param.get("k")+"</dt>\n" +
"<dd>"+param.get("v")+"</dd>\n" ;
}
html+="</dl>\n" +
" </div>";
}
System.out.println(html);
return html;
}
}
} catch (Exception e) {
e.printStackTrace();
} return "";
}
在数据库中存储的 json 串:
[
{
"group": "主体",
"params": [
{
"k": "品牌",
"v": "花纹"
},
{
"k": "型号",
"v": "555"
},
{
"k": "颜色",
"v": "666"
},
{
"k": "上市年份",
"v": "6666"
}
]
},
{
"group": "网络",
"params": [
{
"k": "4G网络制式",
"v": "66"
},
{
"k": "3G网络制式",
"v": "66"
},
{
"k": "2G网络制式",
"v": "66"
}
]
},
{
"group": "存储",
"params": [
{
"k": "机身内存",
"v": "66"
},
{
"k": "储存卡类型",
"v": "66"
}
]
}
]
通过
List<Map> jsonList = JsonUtils.jsonToList(data, Map.class); 方法 转换成 java对象 后的样子:
[
{ GROUP = 主体,
params =[
{ k = 品牌, v = 花纹 },
{ k = 型号, v = 555 },
{ k = 颜色, v = 666 },
{ k = 上市年份, v = 6666 }
]
}, { GROUP = 网络,
params =[
{ k = 4G网络制式, v = 66 },
{ k = 3G网络制式, v = 66 },
{ k = 2G网络制式, v = 66 }
]
}, { GROUP = 存储,
params =[
{ k = 机身内存, v = 66 },
{ k = 储存卡类型, v = 66 }
]
}
]
最外层是个 list ,然后里面是 map1,map1 里面的 key 为 params 的值 还是一个 List2,然后里面又是 Map2
下面附上 json工具类的代码:
package com.taotao.common.utils; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper; public class JsonUtils { // 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper(); /**
* 将对象转换成json字符串。
* <p>Title: pojoToJson</p>
* <p>Description: </p>
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
} /**
* 将json结果集转化为对象
*
* @param jsonData json数据
* @param clazz 对象中的object类型
* @return
*/
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 将json数据转换成pojo对象list
* <p>Title: jsonToList</p>
* <p>Description: </p>
* @param jsonData
* @param beanType
* @return
*/
public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
} return null;
} }
下面附上分类模板的数据库中存的 json 串(仅供参考模板和最终值直接的关系):
[
{
"group": "主体",
"params": [
"品牌",
"型号",
"颜色",
"上市年份"
]
},
{
"group": "网络",
"params": [
"4G网络制式",
"3G网络制式",
"2G网络制式"
]
},
{
"group": "存储",
"params": [
"机身内存",
"储存卡类型"
]
}
]