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

文章讲述了如何从给定的JSON字符串中,通过指定字段名如arrtibutes,提取嵌套层级的数据,如id、path和fileType。展示了两种方法:一种是简单的单属性匹配,另一种是处理复杂嵌套结构的详细逻辑
摘要由CSDN通过智能技术生成

<仅支持取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 = jsonChar[i];

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 = jsonChar[i];

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 (jsonChar[last] == '}' || jsonChar[last] == ']' || jsonChar[last] == ',') {

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 (jsonChar[last] == '}' || jsonChar[last] == ']' || jsonChar[last] == ',') {

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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值