java正则表达式获取json字符串中指定key的value

<仅支持取JSON字符串中, 简单属性值的配置, 即值内容中不包含\[\]或{}格式的数据>

import org.apache.commons.lang3.StringEscapeUtils;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;

import java.util.List;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class JsonAttributeFormatTest {

public static void main(String\[\] args) {

String parem = "{ \" param \" :{ \" song_id \" : \" 10023423001 \" }, \" param2 \" :{ \" song_id \" : \" 10023423001 \" , \" sec_code \" : \" 000001 \" , \" sec_short_name \" : \" 万科A \" }, \" param3 \" :{ \" song_id \" : \" 10023423001 \" , \" sec_code \" : \" 000001 \" , \" sec_short_name \" : \" 万科A \" , \" arrtibutes \" :{ \" id \" :2955, \" path \" : \" /file/word \" , \" fileType \" : \" xml \" }}, \" param4 \" :{ \" song_id \" : \" 10023423001 \" , \" sec_code \" : \" 000001 \" , \" sec_short_name \" : \" 万科A \" , \" arrtibutes \" :{ \" id \" :2955, \" path \" : \" /file/word \" , \" fileType \" : \" xml \" , \" arrtibutes2 \" :{ \" id \" :2955, \" path \" : \" /file/word \" , \" fileType \" : \" xml \" }}}, \" param5 \" :{ \" song_id \" : \" 10023423001 \" , \" sec_code \" : \" 000001 \" , \" arrtibutes \" :{ \" id \" :2955, \" path \" : \" /file/word \" , \" fileType \" : \" xml \" }, \" sec_short_name \" : \" 万科A \" }, \" paramList \" :**** ****\\"**** ****name**** ****\\"**** ****,**** ****\\"**** ****work**** ****\\"**** ****,**** ****\\"**** ****good**** ****\\"**** ****, \" paramList2 \" :2,4,6,7, \" paramList3 \" :{**** ****\\"**** ****song_id**** ****\\"**** ****:**** ****\\"**** ****10023423001**** ****\\"**** ****}, \" paramList4 \" :{**** ****\\"**** ****song_id**** ****\\"**** ****:**** ****\\"**** ****10023423001**** ****\\"**** ****},{**** ****\\"**** ****song_id**** ****\\"**** ****:**** ****\\"**** ****10023423001**** ****\\"**** ****,**** ****\\"**** ****sec_code**** ****\\"**** ****:**** ****\\"**** ****000001**** ****\\"**** ****,**** ****\\"**** ****sec_short_name**** ****\\"**** ****:**** ****\\"**** ****万科A**** ****\\"**** ****}, \" parameter \" :{ \" biz_code \" : \" 10023423001 \" , \" biz_title \" : \" 是东风风光 \" , \" userList \" :{**** ****\\"**** ****name**** ****\\"**** ****:**** ****\\"**** ****张三**** ****\\"**** ****,**** ****\\"**** ****phone**** ****\\"**** ****:12355566},{**** ****\\"**** ****name**** ****\\"**** ****:**** ****\\"**** ****李四**** ****\\"**** ****,**** ****\\"**** ****phone**** ****\\"**** ****:1567889}}, \" address \" :null, \" type \" : \"\" , \" song_id \" : \" 132430001 \" }" ;

parem = StringEscapeUtils.unescapeJava (parem);

System.out .println(getFieldListFromJsonStr (parem,"id" ));

}

public static List<String> getFieldListFromJsonStr(String jsonStr, String fieldName) {

List<String> fieldValues = new ArrayList<>();

String regex = "(?<=( \" " + fieldName + " \" :)).*?(?=(,| \\ }))" ; //单属性配置,且内容中不包含\[\]或{}格式数据

Pattern pattern = Pattern.compile (regex);

Matcher matcher = pattern.matcher(jsonStr);

while (matcher.find()) {

if (StringUtils.isNotEmpty (matcher.group().trim())) {

fieldValues.add(matcher.group().trim());

}

}

return fieldValues;

}

}

<在JSON字符串中,通过指定属性名称, 获取任意格式的数据>

import org.apache.commons.lang3.StringEscapeUtils;

import org.springframework.util.StringUtils;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.Map;

/**

* jlZhang.oth

*/

public class JsonHandler {

public static void main(String\[\] args) {

String str = "{ \" param \" :{ \" song_id \" : \" 10023423001 \" }, \" param2 \" :{ \" song_id \" : \" 10023423006 \" , \" sec_code \" : \" 000001 \" , \" sec_short_name \" : \" 万科A \" }, \" param3 \" :{ \" song_id \" : \" 10023423001 \" , \" sec_code \" : \" 000001 \" , \" sec_short_name \" : \" 万科A \" , \" arrtibutes \" :{ \" id \" :2955, \" path \" : \" /file/word \" , \" fileType \" : \" xml \" }}, \" paramList \" :**** ****\\"**** ****name**** ****\\"**** ****,**** ****\\"**** ****work**** ****\\"**** ****,**** ****\\"**** ****good**** ****\\"**** ****, \" paramList2 \" :2,4,6,7, \" paramList3 \" :{**** ****\\"**** ****song_id**** ****\\"**** ****:**** ****\\"**** ****10023423001**** ****\\"**** ****}, \" paramList4 \" :{**** ****\\"**** ****song_id**** ****\\"**** ****:**** ****\\"**** ****10023423001**** ****\\"**** ****},{**** ****\\"**** ****song_id**** ****\\"**** ****:**** ****\\"**** ****10023423001**** ****\\"**** ****,**** ****\\"**** ****sec_code**** ****\\"**** ****:**** ****\\"**** ****000001**** ****\\"**** ****,**** ****\\"**** ****sec_short_name**** ****\\"**** ****:**** ****\\"**** ****万科A**** ****\\"**** ****}, \" parameter \" :{ \" biz_code \" : \" 10023423001 \" , \" biz_title \" : \" 是东风风光 \" , \" userList \" :{**** ****\\"**** ****name**** ****\\"**** ****:**** ****\\"**** ****张三**** ****\\"**** ****,**** ****\\"**** ****phone**** ****\\"**** ****:12355566},{**** ****\\"**** ****name**** ****\\"**** ****:**** ****\\"**** ****李四**** ****\\"**** ****,**** ****\\"**** ****phone**** ****\\"**** ****:1567889}}, \" address \" :null, \" type \" : \"\" , \" song_iddd \" :true}" ;

String result = getFiledValueFromJsonStr (str, "arrtibutes" , 300);

System.out .println(result);

}

private static String getFiledValueFromJsonStr(String jsonStr, String fieldName, Integer orderFindNumber) {

if (StringUtils.isEmpty (jsonStr) || StringUtils.isEmpty (fieldName)) {

return "" ;

}

orderFindNumber = (orderFindNumber == null || orderFindNumber <= 1) ? 1 : orderFindNumber;

jsonStr = StringEscapeUtils.unescapeJava (jsonStr);

char \[\] jsonChar = jsonStr.toCharArray();

// 封装\[\]以及{}的定位信息

Map<Integer, Integer> mapIndex = new HashMap<Integer, Integer>(); // 记录成对{}的索引

Map<Integer, Integer> listIndex = new HashMap<Integer, Integer>(); // 记录成对\[\]的索引

Boolean strFlag = null ;

LinkedList<Integer> mapMark = new LinkedList<>();

LinkedList<Integer> listMark = new LinkedList<>();

for (int i = 0; i < jsonChar.length ; i++) {

char c = jsonChari;

if (c == ' ' ) {

continue ;

} else if (c == '"' ) {

if (strFlag != null && strFlag == true ) {

strFlag = null ;

} else {

strFlag = true ;

}

}

if (strFlag == null ) {

if (c == '{' ) {

mapMark.add(i);

} else if (c == '}' ) {

mapIndex.put(mapMark.getLast(), i);

mapMark.removeLast();

} else if (c == '[' ) {

listMark.add(i);

} else if (c == ']' ) {

listIndex.put(listMark.getLast(), i);

listMark.removeLast();

}

}

}

// 定位该属性名称的索引位置

StringBuilder attrSb = new StringBuilder();

attrSb.append(" \" " ).append(fieldName).append(" \" " );

int nameLocation = 0;

for (int i = 0; i < orderFindNumber; i++) {

if (nameLocation == 0) {

if (jsonStr.indexOf(attrSb.toString()) == -1) return "" ; // 首个属性名没设置直接返回

nameLocation = jsonStr.indexOf(attrSb.toString());

} else {

if (jsonStr.indexOf(attrSb.toString(), nameLocation + 1) == -1) continue ; // 后续没找到取上一个属性名

nameLocation = jsonStr.indexOf(attrSb.toString(), nameLocation + 1);

}

}

int markLocation = jsonStr.indexOf(":" , nameLocation);

LinkedList<Integer> strIndex = new LinkedList<>();

LinkedList<Integer> cutOut = new LinkedList<>();

for (int i = markLocation + 1; i < jsonChar.length ; i++) {

char c = jsonChari;

if (c == ' ' ) {

continue ;

} else if (c == '"' ) {

if (strIndex.size() == 0) {

strIndex.add(i);

} else {

strIndex.add(i + 1);

cutOut.addAll(strIndex);

break ;

}

}

if (strIndex.size() == 0) {

if ("n" .equalsIgnoreCase(String.valueOf (c)) || "f" .equalsIgnoreCase(String.valueOf (c)) || "t" .equalsIgnoreCase(String.valueOf (c))) {

// null, false, true值

cutOut.add(i);

int last = (jsonStr.indexOf(":" , i) == -1) ? jsonStr.length() - 1 : jsonStr.indexOf("," , i);

// 排除格式: ..."cache":null}],

while (jsonCharlast == '}' || jsonCharlast == ']' || jsonCharlast == ',' ) {

last = last - 1;

}

cutOut.add(last + 1);

break ;

}

if (Character.isDigit (c)) {

cutOut.add(i);

int last = (jsonStr.indexOf(":" , i) == -1) ? jsonStr.length() - 1 : jsonStr.indexOf("," , i);

// 排除格式: ..."cache":456}],

while (jsonCharlast == '}' || jsonCharlast == ']' || jsonCharlast == ',' ) {

last = last - 1;

}

cutOut.add(last + 1);

break ;

}

if (c == '{' ) {

Integer last = mapIndex.get(i);

if (null != last) {

cutOut.add(i);

cutOut.add(last + 1);

}

break ;

} else if (c == '[' ) {

Integer last = listIndex.get(i);

if (null != last) {

cutOut.add(i);

cutOut.add(last + 1);

}

break ;

}

}

}

// 获取最终的结果

if (cutOut.size() == 0) return "" ;

String result = jsonStr.substring(cutOut.getFirst(), cutOut.getLast());

return result;

}

}

相关推荐
大哥您好1 小时前
QEMU 11.1.2 多架构编译指南(x86_64 / aarch64 / riscv64)
linux·服务器
数据库小学妹1 小时前
国产数据库怎么选?兼容、迁移、核心案例与融合架构四道关
数据库·架构·国产数据库·数据库迁移·融合数据库
IvorySQL2 小时前
PostgreSQL 日报| PgBouncer 修复三个 CVE 漏洞(10 月 15 日)
数据库·postgresql·区块链
饺子大魔王的男人2 小时前
后台表格、查询、流程总在重复写?我用ToolJet把PostgreSQL直接做成可远程访问的业务系统
数据库·postgresql
道满科技2 小时前
Function Calling 参数总出错?只修参数就行
linux·windows·python
Gauss松鼠会3 小时前
高斯数据库(openGauss)的物理存储结构
运维·服务器·数据库·sql·opengauss·经验总结
Android系统攻城狮3 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_prepare_read调用流程与实战(七十四)
linux·运维·服务器·gstreamer音视频·音视频进阶
杨云龙UP3 小时前
PostgreSQL 18.4 数据库整库迁移实战:pg_dump 备份与 pg_restore 恢复完整操作手册
运维·服务器·数据库·postgresql·pg_dump·pg_restore
我科绝伦(Huanhuan Zhou)3 小时前
Linux 通用压力测试脚本合集:磁盘 + 网络
linux·网络·压力测试