key value map实现一对多

6 篇文章 0 订阅
5 篇文章 0 订阅

目前在写模型转换,上一篇文章主要是解决了递归获取属性地址,属性名称,还有属性值的方法

经过改造以后,上一篇文章发现属性地址和属性名称是关联的,觉得对后期拆解很麻烦,所以想的是将属性地址和属性名称分开

由于同一个属性地址需要和属性以及属性值进行关联,所以需要将他们进行一个整合

整合的时候发现了一个问题,以前的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>

生活要有缝隙,阳光才会照进来

愿彼此成长,共同进步


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值