带有数组数据结构的json字符串解析并保留其原有顺序

今天在工作中遇到一个问题,一个服务提供接口数据,且数据为字符串,字符串中有Map结构也保持有顺序,另一个接口,获取时需要保留原有的map顺序,且存放到linkHashMap中,最终放入缓存中进行使用。

本例中使用alibaba 的fastJson进行字符和json之间的转换

情况1:如果只是直接返回一个map:

 下图为提供接口的代码:

List<String> tenantList = dao.queryDynwordsTenantList();
List<Map<String,String>> result = new ArrayList<>();
for (String tenant : tenantList) {
    Map<String, String> data = getDynwordsSetMapByTenant(tenant);
    result.add(data);
}
return new JsonResult(result);

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<LinkedHashMap>(){}); 

System.out.println(jsonBody);

L此时存放在Map 中的 红框部分 顺序已经变了,更别说遍历了

{code=0000, data=[{"tenantId":"tenantA","agreementType":"合约类型","isMulitNum":"一证多号","agreementBeginDate":"合约开始时间","custName":"客户姓名","agreementEndDate":"合约到期时间"},{"tenantId":"uni097","agreementType":"合约类型","agreementBeginDate":"合约开始时间","custName":"客户姓名"}], msg=SUCCESS}

情况2:返回的时候将map进行类型转换,转化成josnString

下图为提供数据的接口代码:注意标红部分

List<String> tenantList = dao.queryDynwordsTenantList();
List<Map<String,String>> result = new ArrayList<>();
for (String tenant : tenantList) {
    Map<String, String> data = getDynwordsSetMapByTenant(tenant);
    result.add(data);
}
return new JsonResult(JSON.toJSONString(result));
//使用JOSN转换为json串,便于数组集合获取的时候按原有顺序

为js

如图为返回的数据格式:

其中每个“”都进行的了转义。

字符串解析:

另一个服务在调用该接口,进行字符串解析的时候,执行之前的转化为map的方法时,此时[]里的数据时按字符串进行解析的,保持了原来的顺序

LinkedHashMap jsonBody = JSON.parseObject(json, new TypeReference<LinkedHashMap>(){}); 
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<LinkedHashMap> results = JSON.parseObject(jsonBody.get(“data”).toString(), new TypeReference<List<LinkedHashMap>>(){}); 
//接口返回data信息

然后进行遍历:

for (int i = 0; i < results.size(); i++) {
LinkedHashMap<String, String> 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=客户姓名}}

猜你喜欢

转载自blog.csdn.net/l1994m/article/details/81223790