Java 正则表达式 匹配json字符串某个值的key值

 

Java正则表达式 匹配json格式的字符串某个值的key

 

在处理数据中,需要找到含有某个值的数组的key的内容,比如:

Json数据格式:

{"file_c":[{"uploadTime":"1621998257947","size":"147879","requestId":"594885615247740928","name":"充值卡.txt"}],"content":"上传附件"}

根据是否含有uploadTime上传时间,来判断是否有附件的内容,并获取到对应的key值“file_c”

 

语法:

.

匹配除了换行符以外的任何字符

\w

匹配字母或数字或下划线或汉字 等价于'[^A-Za-z0-9_]'

 

 

 

处理

写正则表达式:

因为匹配的是 带数组的字符串,key值是数字和大小写加下划线组成的:([0-9a-zA-Z_]*)或是用 \w

value值是:[{开头的,中间有各种值,所以用“.”即:  "\\[\\{.*"

中间是用: 分隔的即 "\":"

最后: String pattern = "(\\w*)"+"\":"+"\\[\\{.*" + keyField;

 

使用.*:

private static String getContainKey(String content, String keyField) {
    System.out.println("content "+content);
    String patternStr = "\\[\\{.*";
    String pattern = "(\\w*)"+"\":"+patternStr + keyField;
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(content);
    String aimKey = "";
    if (m.find()) {
        aimKey = m.group(1);
    }
    System.out.println("aim "+aimKey);
    return aimKey;
}

 

JSON测试:

public static void main(String[] args) {
    testJson();
}

public static void testJson() {
    JSONObject paramJson = new JSONObject();
    paramJson.put("file_json", initAttachData());
    paramJson.put("content", "上传附件");
    paramJson.put("startDate", "2021-05-01 00:00:00");
    paramJson.put("endDate", "2021-05-13 00:00:00");
    getContainKey(paramJson.toString(), "uploadTime");
}

public static List<Map<String,Object>> initAttachData(){
    String attach = "{\"uploadTime\":\"1621998257947\",\"size\":\"147879\",\"requestId\":\"594885615247740928\",\"name\":\"充值卡.txt\"}";
    Map<String,Object> paramMap = JSON.parseObject(attach);
    List<Map<String,Object>> attachList = new ArrayList<>();
    attachList.add(paramMap);
    return attachList;
}

 

结果:

content {"endDate":"2021-05-13 00:00:00","file_json":[{"size":"147879","requestId":"594885615247740928","name":"充值卡.txt","uploadTime":"1621998257947"}],"content":"上传附件","startDate":"2021-05-01 00:00:00"}

aim file_json

如果改成map的时候,会如何呢?

因为map会出现“=”的情况,直接把中间的“:”改成“=”可以用吗?

结果却不行,为啥呢? 我也不知道,后面有空再深究

 

Map测试:

如果是map的格式,换成json的格式:

JSONObject paramJSONObj = JSONObject.parseObject(JSON.toJSONString(paramMap));

再进行匹配处理

public static void main(String[] args) {
    testMap();
}

public static void testMap() {
    Map<String,Object> paramMap = new HashMap<>();
    paramMap.put("file_map", initAttachData());
    paramMap.put("content", "上传附件");
    paramMap.put("startDate", "2020-01-01 00:00:00");
    paramMap.put("endDate", "2020-01-13 00:00:00");
    JSONObject paramJSONObj = JSONObject.parseObject(JSON.toJSONString(paramMap));
    getContainKey(paramJSONObj.toJSONString(), "uploadTime");
}

结果:

content {"file_map":[{"size":"147879","requestId":"594885615247740928","name":"充值卡.txt","uploadTime":"1621998257947"}],"endDate":"2020-01-13 00:00:00","content":"上传附件","startDate":"2020-01-01 00:00:00"}

aim file_map

 

总结:

  匹配json格式字符串的key的时候,根据value的特性来处理,记得“.”可以匹配除了换行符以外的任何字符,就好处理了。一个个去拼接,去测验,多点耐心就完成了。

 


版权声明:本文为qq_35461948原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。