目前在写模型转换,上一篇文章主要是解决了递归获取属性地址,属性名称,还有属性值的方法
经过改造以后,上一篇文章发现属性地址和属性名称是关联的,觉得对后期拆解很麻烦,所以想的是将属性地址和属性名称分开
由于同一个属性地址需要和属性以及属性值进行关联,所以需要将他们进行一个整合
整合的时候发现了一个问题,以前的hashmap只能进行key-value属性一一对应,但是json串可能一个地址是一个list,list里面属性名称又是相同的。所以没有办法解决这个问题,当初考虑是否可以用 IdentityHashMap 这个是可以相同的key 不同的value值。但是用到这个方法就会导致一个问题,我是写在了递归里面,会导致重复值出现,这种不可取,后来想list是不是可以呢?发现list也同样不可取,也会存在重复的问题,后来经过查找资料,最后选择了
MultiValueMap:这个可以一个key对应多个属性值,所以选型基本定下来了,基本结构是
MultiValueMap<String,Map<String,String>> objectObjectHashMap = new MultiValueMap<>();
以下内容是具体代码,可以参考
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.MultiValueMap;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 投保查询缓存实现
*
* @author 中科软
*/
@Service
@Slf4j
public class QueryJsonModelTransServiceImpltrue {
/**
* @param
* @description: 解析json,返回属性路径,属性,属性之值
* @return:
* @author: 齐天铭
* @time: 2021/6/29 11:40 上午
*/
public static Map SourceJsonToDestJson1(Object objJson, StringBuffer sb, MultiValueMap<String, Map<String, String>> objectObjectHashMap) {
// 判断入参类型是什么
if (objJson instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) objJson;
// 如果为list,则需要进行递归每一条数据
if (jsonArray.size() > 0) {
for (int i = 0; i < jsonArray.size(); i++) {
// 将子信息串进行递归,直到拿到属性值
SourceJsonToDestJson1(jsonArray.getJSONArray(i), sb, objectObjectHashMap);
}
}
} else if (objJson instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) objJson;
// 获取jsonkey进行迭代获取key信息
Iterator<String> keys = jsonObject.keySet().iterator();
while (keys.hasNext()) {
//用于获取当前属性的属性地址
StringBuffer sb1 = new StringBuffer();
// 获取当前属性名称
String key = keys.next();
// 当前属性=父属性+属性名称
sb1.append(sb + "/" + key);
// stringStringHashMap.put(sb.toString(), key);
// 判断当前属性是否包含其他json信息
if (isJsonObject(jsonObject.get(key).toString())) {
// 通过key解析当前属性信息
JSONObject jsonObject2 = JSONObject.parseObject(jsonObject.get(key).toString());
// 将子信息串进行递归,直到拿到属性值
SourceJsonToDestJson1(jsonObject2, sb1, objectObjectHashMap);
// 如果为list,则需要进行递归每一条数据
} else if (isJsonArray(jsonObject.get(key).toString())) {
// 通过key解析当前属性信息
JSONArray jsonArray = JSONArray.parseArray(jsonObject.get(key).toString());
if (jsonArray.size() > 0) {
for (int i = 0; i < jsonArray.size(); i++) {
// 将子信息串进行递归,直到拿到属性值
SourceJsonToDestJson1(jsonArray.getJSONObject(i), sb1, objectObjectHashMap);
}
}
} else {
IdentityHashMap<String, String> stringStringHashMap = new IdentityHashMap<>();
// 查询数据库得到目标属性
String o = jsonObject.get(key).toString();
// 拼接属性名称和属性值
stringStringHashMap.put(key, o);
// 将属性地址和拼接好的属性地址和属性值的map进行整合
objectObjectHashMap.put(sb.toString(), stringStringHashMap);
// System.out.println(sb + key + o);
}
}
}
return objectObjectHashMap;
}
/**
* @param jsonString
* @description: 判断是否为json
* @return: java.lang.Boolean
* @author: 齐天铭
* @time: 2021/6/29 11:42 上午
*/
public static Boolean isJsonObject(String jsonString) {
try {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
return true;
} catch (Exception e) {
return false;
}
}
/**
* @param jsonString
* @description: 判断是否为jsonarray
* @return: java.lang.Boolean
* @author: 齐天铭
* @time: 2021/6/29 11:42 上午
*/
public static Boolean isJsonArray(String jsonString) {
try {
JSONArray objects = JSONObject.parseArray(jsonString);
return true;
} catch (Exception e) {
return false;
}
}
public static void main(String[] args) {
String s = "{\n" +
" \"title\": \"新增的任务的表单信息\", \n" +
" \"type\": \"object\", \n" +
" \"properties\": {\n" +
" \"finishTime\": {\n" +
" \"type\": \"number\", \n" +
" \"title\": \"任务结束时间例如:1450708950086\", \n" +
" \"contactEmail\": [{\n" +
" \"type\": \"string234234\", \n" +
" \"title\": \"联系人邮箱111222\"\n" +
" }, {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"联系人邮箱\"\n" +
" }]\n" +
" }, \n" +
" \n" +
" \"sexType\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"招聘性别要求,FEMALE:女,MALE:男,UNKWON:男女不限\"\n" +
" }, \n" +
" \"enrollEndTime\": {\n" +
" \"type\": \"number\", \n" +
" \"title\": \"报名截止时间例如:1450708950086\"\n" +
" }, \n" +
" \"description\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"备注\"\n" +
" }, \n" +
" \"weekday\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"工作日期\"\n" +
" }, \n" +
" \"title\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"任务标题\"\n" +
" }, \n" +
" \"startTime\": {\n" +
" \"type\": \"number\", \n" +
" \"title\": \"任务开始时间,例如:1450708950086\"\n" +
" }, \n" +
" \"contactTelephone\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"联系人电话\"\n" +
" }, \n" +
" \"timeDescription\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"工作时间描述\"\n" +
" }, \n" +
" \"paymentType\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"支付类型 0:线上支付,1:线下支付\"\n" +
" }, \n" +
" \"addressList\": {\n" +
" \"items\": {\n" +
" \"properties\": {\n" +
" \"latitude\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"纬度\"\n" +
" }, \n" +
" \"cityName\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"城市名称\"\n" +
" }, \n" +
" \"areaName\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"区域名称\"\n" +
" }, \n" +
" \"longitude\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"经度\"\n" +
" }, \n" +
" \"address\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"t工作地点\"\n" +
" }\n" +
" }, \n" +
" \"type\": \"object\", \n" +
" \"description\": \"任务地址\"\n" +
" }, \n" +
" \"type\": \"array\", \n" +
" \"title\": \"地址列表\"\n" +
" }, \n" +
" \"balanceUnit\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"兼职金额单位;例如:元/小时,元/天等\"\n" +
" }, \n" +
" \"contactName\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"联系人姓名\"\n" +
" }, \n" +
" \"content\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"工作内容\"\n" +
" }, \n" +
" \"balance\": {\n" +
" \"type\": \"number\", \n" +
" \"title\": \"兼职金额\"\n" +
" }, \n" +
" \"headcount\": {\n" +
" \"type\": \"integer\", \n" +
" \"title\": \"招聘人数\"\n" +
" }, \n" +
" \"typeDesc\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"任务类型描述: 只有在任务类型为其他时有效\"\n" +
" }, \n" +
" \"type\": {\n" +
" \"type\": \"string\", \n" +
" \"title\": \"任务类型;例如:传单派发,服务员等\"\n" +
" }, \n" +
" \"balanceType\": {\n" +
" \"type\": \"integer\", \n" +
" \"title\": \"结算类型;例如:完工结,日结等\"\n" +
" }\n" +
" }\n" +
"}";
JSONObject jsonObject = JSONObject.parseObject(s);
StringBuffer sb = new StringBuffer();
MultiValueMap<String, Map<String, String>> objectObjectHashMap = new MultiValueMap<>();
//用于拼接路径
SourceJsonToDestJson1(jsonObject, sb, objectObjectHashMap);
System.out.println(objectObjectHashMap);
}
}
本次开发基于spring boot 需要在pom.xml导入依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
生活要有缝隙,阳光才会照进来