今天在工作中遇到一个问题,一个服务提供接口数据,且数据为字符串,字符串中有Map结构也保持有顺序,另一个接口,获取时需要保留原有的map顺序,且存放到linkHashMap中,最终放入缓存中进行使用。
本例中使用alibaba 的fastJson进行字符和json之间的转换
下图为提供接口的代码:
List tenantList = dao.queryDynwordsTenantList();
List
L数据结构如下:(注:code,msg为new JsonResult时自行添加,可忽略,主要看里面map的形式)
{"code":"0000","data":[{"custName":"客户姓名","agreementBeginDate":"合约开始时间","agreementEndDate":"合约到期时间","agreementType":"合约类型","isMulitNum":"一证多号","tenantId":"tenantA"},{"agreementBeginDate":"合约开始时间","agreementType":"合约类型","custName":"客户姓名","tenantId":"uni097"}],"msg":"SUCCESS"}
图中标注该map返回的具体格式
请求数据的接口,使用下图进行字符串解析:
LinkedHashMap jsonBody = JSON.parseObject(json, new TypeReference(){});
System.out.println(jsonBody);
L此时存放在Map 中的 红框部分 顺序已经变了,更别说遍历了
{code=0000, data=[{"tenantId":"tenantA","agreementType":"合约类型","isMulitNum":"一证多号","agreementBeginDate":"合约开始时间","custName":"客户姓名","agreementEndDate":"合约到期时间"},{"tenantId":"uni097","agreementType":"合约类型","agreementBeginDate":"合约开始时间","custName":"客户姓名"}], msg=SUCCESS}
下图为提供数据的接口代码:注意标红部分
List tenantList = dao.queryDynwordsTenantList();
List
如图为返回的数据格式:
其中每个“”都进行的了转义。
字符串解析:
另一个服务在调用该接口,进行字符串解析的时候,执行之前的转化为map的方法时,此时[]里的数据时按字符串进行解析的,保持了原来的顺序
LinkedHashMap jsonBody = JSON.parseObject(json, new TypeReference(){});
System.out.println(jsonBody);
json即为调用接口返回的字符串名称,之前代码省略;
输出结果如下:
{code=0000, data=[{"custName":"客户姓名","agreementBeginDate":"合约开始时间","agreementEndDate":"合约到期时间","agreementType":"合约类型","isMulitNum":"一证多号","tenantId":"tenantA"},{"agreementBeginDate":"合约开始时间","agreementType":"合约类型","custName":"客户姓名","tenantId":"uni097"}], msg=SUCCESS}
从上面分析顺序是正确的。
在使用时,利用的是data里面的数据,所有进行二次解析。
由于【】中有两个集合,先转换成list
List results = JSON.parseObject(jsonBody.get(“data”).toString(), new TypeReference>(){});
//接口返回data信息
然后进行遍历:
for (int i = 0; i < results.size(); i++) {
LinkedHashMap result = JSON.parseObject(JSON.toJSONString(results.get(i)), LinkedHashMap.class); //需要排序
String tenantId = null;
tenantId = result.get(BaseConstants.TENANTKEY);
String cacheKey = new StringBuilder(version).append(tenantId).append(“data”).toString();
result.remove(BaseConstants.TENANTKEY);
UnisetCache.getInstance().getDynWords().put(cacheKey, result); //放入缓存中,注意此时map里面存放的数据是带有顺序存储的
}
此时执行程序,将该map放入缓存中,是带有顺序的,读取的时候也会保持顺序
System.out.println("DynWord:"+UnisetCache.getInstance().getDynWords());
DynWord:{version2tenantAdynWords={custName=客户姓名, agreementBeginDate=合约开始时间, agreementEndDate=合约到期时间, agreementType=合约类型, isMulitNum=一证多号}, version2uni097dynWords={agreementBeginDate=合约开始时间, agreementType=合约类型, custName=客户姓名}}