有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的hashmap如何添加嵌套映射对象

我有一个JSON数据,我正在将该负载转换为嵌套的映射对象。但根据我的逻辑,它是压倒一切的

我有这样的输入json

{"mapping": {
        "EVENT.alertMessage": "input.Message",
        "EVENT.id": "input.id",
        "EVENT.severity": "Functions.toString(\"P1\")",
        "EVENT.eventTime": "input.eventTime",
        "EVENT.eventType": "input.alertType",
        "EVENT.geocoordinates.location": "Functions.toString(\"\")",
        "EVENT.deviceName": "Functions.toString(\"\")",
        "EVENT.visualInfo.imageUrl": "input.imageUrl",
        "EVENT.deviceId": "input.cameraId",
        "EVENT.geocoordinates.longitude": "Functions.toString(\"\")",
        "EVENT.visualInfo.videoUrl": "input.videoUrl",
        "EVENT.tenantCode": "Functions.toString(\"\")",
        "EVENT.MAC": "input.cameraId",
        "EVENT.DATE_TIME": "Functions.currentDate(\"yyyy-MM-dd HH:mm:ss\",\"UTC\")",
        "EVENT.geocoordinates.latitude": "Functions.toString(\"\")"
    }
    }

在这里,我从上面的输入JSON键迭代并形成map对象

外汇: 输入:

{"mapping": {
            "TEST.key1": "a",
            "TEST.key2.key3": "b",
           }
}
OUTPUT:
{
"TEST":{
  "key1":a,
  "key2":{
   "key3":b
   }
  }
 }

我写的代码是

JSONObject json=new JSONObject(mappingData).getJSONObject("mapping");
            Iterator<String> keys=new JSONObject(mappingData).getJSONObject("mapping").keys();
            Map<String,Object> map = new HashMap<>();
            while(keys.hasNext()) {
                String val = keys.next();
                String[] key=val.split("(?<!/)\\.");
                Map<String, Object> lastKeyMap = null;
                for(int i=0;i<key.length;i++)
                {

                    if(i== 0 && key.length==1){

                        String outputVal=json.getString(val);
                        if(outputVal.contains("[]")){
                            outputVal=outputVal.replace("[]", "[i]");
                        }
                        //Matcher m = Pattern.compile("\\.([a-zA-Z0-9]{0,}\\/.[a-zA-Z0-9])|([a-zA-Z0-9]{0,}\\/.[a-zA-Z0-9])")
                        //      .matcher(outputVal);
                        Matcher m = Pattern.compile("\\.([a-zA-Z0-9]{0,}\\/.[a-zA-Z0-9]{0,})")
                                        .matcher(outputVal);
                        while (m.find()) {
                            outputVal=m.replaceAll("[`$1`]").replace("/", "");
                        }

                        if(key[i].contains("/"))
                        {
                            map.put("`"+key[i].replace("/", "")+"`",outputVal);
                        }
                        else{
                            map.put(key[i],outputVal);
                        }
                    }


                    else if(i== 0 && key.length>1){

                        if(map.containsKey(key[i])){
                            lastKeyMap = (Map<String, Object>) map.get(key[i]);
                        }else{
                            if(key[i].contains("/"))
                            {
                                lastKeyMap = new HashMap<String,Object>();
                                map.put("`"+key[i].replace("/", "")+"`",lastKeyMap);
                            }
                            else{
                                lastKeyMap = new HashMap<String,Object>();
                                map.put(key[i],lastKeyMap);
                            }
                        }

                    }else if(i== key.length-1 ){

                        String outputVal=json.getString(val);
                        if(outputVal.contains("[]")){
                            outputVal=outputVal.replace("[]", "[i]");
                        }
                        //Matcher m = Pattern.compile("\\.([a-zA-Z0-9]{0,}\\/.[a-zA-Z0-9])|([a-zA-Z0-9]{0,}\\/.[a-zA-Z0-9])")
                        //      .matcher(outputVal);
                        Matcher m = Pattern.compile("\\.([a-zA-Z0-9]{0,}\\/.[a-zA-Z0-9]{0,})")
                                        .matcher(outputVal);
                        while (m.find()) {
                            outputVal=m.replaceAll("[`$1`]").replace("/", "");
                        }

                        if(key[i].contains("/"))
                        {
                            lastKeyMap.put("`"+key[i].replace("/", "")+"`", outputVal);
                        }
                        else{
                            lastKeyMap.put(key[i], outputVal);
                        }
                    }else{
                        Map<String,Object> objMap = new HashMap<>();
                        if(key[i].contains("/"))
                        {
                            lastKeyMap.put("`"+key[i].replace("/", "")+"`", objMap);
                            lastKeyMap = objMap;
                        }
                        else{
                            lastKeyMap.put(key[i], objMap);
                            lastKeyMap = objMap;
                        }
                    }


                }
            }

我得到的结果是:

{EVENT={severity=Functions.toString("P1"), alertMessage=input.alertMessage, id=input.id, eventTime=input.eventTime, visualInfo={videoUrl=input.videoUrl}, eventType=input.alertType, tenantCode=Functions.toString(""), DATE_TIME=Functions.currentDate("yyyy-MM-dd HH:mm:ss","UTC"), geocoordinates={latitude=Functions.toString("")}, deviceName=Functions.toString(""), deviceId=input.cameraId, MAC=input.cameraId}}

但是在结果中EVENT.geocoordinates.longitudeEVENT.geocoordinates.longitude被跳过,因为映射正在被覆盖。像那样EVENT.visualInfo.imageUrl也被EVENT.visualInfo.videoUrl覆盖。那么,我如何克服这个问题,通过迭代而不覆盖veing来形成一个包含所有json键的映射或json呢


共 (1) 个答案

  1. # 1 楼答案

    最好的方法是根据json模式创建java类:

    public class Test {
    
        @SerializedName("mapping")
        public Mapping mapping;
    
        static public class Mapping {
    
            @SerializedName("EVENT.alertMessage")
            public String alertMessage;
    
            @SerializedName("EVENT.id")
            public String id;
    
            @SerializedName("EVENT.severity")
            public String severity;
    
            @SerializedName("EVENT.eventTime")
            public String eventTime;
    
            @SerializedName("EVENT.eventType")
            public String eventType;
    
            @SerializedName("EVENT.geocoordinates.location")
            public String location;
    
            @SerializedName("EVENT.deviceName")
            public String deviceName;
    
            @SerializedName("EVENT.visualInfo.imageUrl")
            public String imageUrl;
    
            @SerializedName("EVENT.deviceId")
            public String deviceId;
    
            @SerializedName("EVENT.geocoordinates.longitude")
            public String longitude;
    
            @SerializedName("EVENT.visualInfo.videoUrl")
            public String videoUrl;
    
            @SerializedName("EVENT.tenantCode")
            public String tenantCode;
    
            @SerializedName("EVENT.MAC")
            public String mac;
    
            @SerializedName("EVENT.DATE_TIME")
            public String dateTime;
    
            @SerializedName("EVENT.geocoordinates.latitude")
            public String latitude;
        }
    }
    

    然后用google gson库解析它

    Test test = new Gson().fromJson("jsonString", Test.class);
    

    使用自己的java对象比使用JSONObject容易得多

    我当前对gradle文件中gson的依赖关系:

    implementation("com.google.code.gson:gson:2.8.6")